1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00
flashrom/tests/meson.build
Peter Marheine 183208b5cb udelay: only use OS time for delays, except on DOS
As proposed on the mailing list ("RFC: remove the calibrated delay
loop" [1]), this removes the calibrated delay loop and uses OS-based
timing functions for all delays because the calibrated delay loop can
delay for shorter times than intended.

When sleeping this now uses nanosleep() unconditionally, since usleep
was only used on DOS (where DJGPP lacks nanosleep).  When busy-looping,
it uses clock_gettime() with CLOCK_MONOTONIC or CLOCK_REALTIME depending
on availability, and gettimeofday() otherwise.

The calibrated delay loop is retained for DOS only, because timer
resolution on DJGPP is only about 50 milliseconds. Since typical delays
in flashrom are around 10 microseconds, using OS timing there would
regress performance by around 500x. The old implementation is reused
with some branches removed based on the knowledge that timer resolution
will not be better than about 50 milliseconds.

Tested by reading and writing flash on several Intel and AMD systems:

 * Lenovo P920 (Intel C620, read/verify only)
 * "nissa" chromebook (Intel Alder Lake-N)
 * "zork" chromebook (AMD Zen+)

[1]: https://mail.coreboot.org/hyperkitty/list/flashrom@flashrom.org/thread/HFH6UHPAKA4JDL4YKPSQPO72KXSSRGME/

Signed-off-by: Peter Marheine <pmarheine@chromium.org>
Change-Id: I7ac5450d194a475143698d65d64d8bcd2fd25e3f
Reviewed-on: https://review.coreboot.org/c/flashrom/+/81545
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Brian Norris <briannorris@chromium.org>
2024-04-25 23:23:01 +00:00

137 lines
3.6 KiB
Meson

# This file is part of the flashrom project.
#
# Copyright 2020 Google LLC
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
test_srcs = files(
'io_mock.c',
'tests.c',
'libusb_wraps.c',
'helpers.c',
'flashrom.c',
'spi25.c',
'lifecycle.c',
'layout.c',
'chip.c',
'chip_wp.c',
'selfcheck.c',
'io_real.c',
'erase_func_algo.c',
'udelay.c',
)
if not programmer.get('dummy').get('active')
test_srcs += programmer.get('dummy').get('srcs')
endif
foreach p_name, p_data : programmer
test_srcs += p_data.get('test_srcs')
endforeach
mocks = [
'-Wl,--wrap=strdup',
'-Wl,--wrap=physunmap',
'-Wl,--wrap=physmap',
'-Wl,--wrap=pcidev_init',
'-Wl,--wrap=pcidev_readbar',
'-Wl,--wrap=spi_send_command',
'-Wl,--wrap=sio_write',
'-Wl,--wrap=sio_read',
'-Wl,--wrap=open',
'-Wl,--wrap=open64',
'-Wl,--wrap=__open64_2',
'-Wl,--wrap=ioctl',
'-Wl,--wrap=read',
'-Wl,--wrap=write',
'-Wl,--wrap=fopen',
'-Wl,--wrap=fopen64',
'-Wl,--wrap=fdopen',
'-Wl,--wrap=fwrite',
'-Wl,--wrap=fflush',
'-Wl,--wrap=stat',
'-Wl,--wrap=stat64',
'-Wl,--wrap=__xstat',
'-Wl,--wrap=__xstat64',
'-Wl,--wrap=fstat',
'-Wl,--wrap=fstat64',
'-Wl,--wrap=__fstat50',
'-Wl,--wrap=__fxstat',
'-Wl,--wrap=__fxstat64',
'-Wl,--wrap=fileno',
'-Wl,--wrap=fsync',
'-Wl,--wrap=fread',
'-Wl,--wrap=fgets',
'-Wl,--wrap=fprintf',
'-Wl,--wrap=fclose',
'-Wl,--wrap=feof',
'-Wl,--wrap=ferror',
'-Wl,--wrap=clearerr',
'-Wl,--wrap=setvbuf',
'-Wl,--wrap=rget_io_perms',
'-Wl,--wrap=OUTB',
'-Wl,--wrap=INB',
'-Wl,--wrap=OUTW',
'-Wl,--wrap=INW',
'-Wl,--wrap=OUTL',
'-Wl,--wrap=INL',
'-Wl,--wrap=usb_dev_get_by_vid_pid_number',
'-Wl,--wrap=libusb_init',
'-Wl,--wrap=libusb_set_debug',
'-Wl,--wrap=libusb_set_option',
'-Wl,--wrap=libusb_open',
'-Wl,--wrap=libusb_set_auto_detach_kernel_driver',
'-Wl,--wrap=libusb_detach_kernel_driver',
'-Wl,--wrap=libusb_attach_kernel_driver',
'-Wl,--wrap=libusb_open_device_with_vid_pid',
'-Wl,--wrap=libusb_get_device',
'-Wl,--wrap=libusb_get_device_list',
'-Wl,--wrap=libusb_free_device_list',
'-Wl,--wrap=libusb_get_bus_number',
'-Wl,--wrap=libusb_get_device_address',
'-Wl,--wrap=libusb_get_device_descriptor',
'-Wl,--wrap=libusb_get_config_descriptor',
'-Wl,--wrap=libusb_free_config_descriptor',
'-Wl,--wrap=libusb_get_configuration',
'-Wl,--wrap=libusb_set_configuration',
'-Wl,--wrap=libusb_claim_interface',
'-Wl,--wrap=libusb_control_transfer',
'-Wl,--wrap=libusb_release_interface',
'-Wl,--wrap=libusb_ref_device',
'-Wl,--wrap=libusb_unref_device',
'-Wl,--wrap=libusb_close',
'-Wl,--wrap=libusb_alloc_transfer',
'-Wl,--wrap=libusb_submit_transfer',
'-Wl,--wrap=libusb_free_transfer',
'-Wl,--wrap=libusb_handle_events_timeout',
'-Wl,--wrap=libusb_exit',
'-Wl,--gc-sections',
]
threads_dep = dependency('threads')
flashrom_tests = executable('flashrom_unit_tests',
test_srcs,
c_args : [
cargs,
'-ffunction-sections',
'-fdata-sections',
'-U_FORTIFY_SOURCE',
],
export_dynamic : true,
link_args : mocks + link_args,
dependencies : [cmocka_dep, flashrom_test_dep, threads_dep],
)
test('cmocka test flashrom', flashrom_tests)
if get_option('llvm_cov').enabled()
run_target('llvm-cov-tests', command : ['../scripts/llvm-cov', flashrom_tests])
endif