ACK: [PATCH] bios: mtrr: make prefetchable checks handle lspci exec failures
Alex Hung
alex.hung at canonical.com
Thu Dec 13 03:12:38 UTC 2012
On 12/07/2012 10:25 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> The is_prefetchable() check just ignored lspci exec failures which
> can lead to false results. Handle this correctly by passing back
> any failures up the chain back to the the test and skip the test if
> we detect lspci failing.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/bios/mtrr/mtrr.c | 50 ++++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 38 insertions(+), 12 deletions(-)
>
> diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
> index 62a91c7..285d284 100644
> --- a/src/bios/mtrr/mtrr.c
> +++ b/src/bios/mtrr/mtrr.c
> @@ -193,38 +193,51 @@ restart:
> return type;
> }
>
> -static bool is_prefetchable(fwts_framework *fw, char *device, uint64_t address)
> +static int check_prefetchable(
> + fwts_framework *fw,
> + char *device,
> + uint64_t address,
> + bool *pref)
> {
> - bool pref = false;
> char line[4096];
> fwts_list *lspci_output;
> fwts_list_link *item;
> int status;
>
> + *pref = false;
> +
> memset(line,0,4096);
>
> snprintf(line, sizeof(line), "%s -v -s %s", fw->lspci, device);
> - fwts_pipe_exec(line, &lspci_output, &status);
> + if (fwts_pipe_exec(line, &lspci_output, &status) != FWTS_OK)
> + return FWTS_ERROR;
> +
> + /* Nothing for this decice? That seems like a failure */
> if (lspci_output == NULL)
> - return pref;
> + return FWTS_ERROR;
>
> fwts_list_foreach(item, lspci_output) {
> char *str = strstr(fwts_text_list_text(item), "Memory at ");
> if (str && strtoull(str+10, NULL, 16) == address) {
> if (strstr(str, "non-prefetchable"))
> - pref = false;
> + *pref = false;
> else if (strstr(str, "(prefetchable"))
> - pref = true;
> + *pref = true;
> else if (strstr(str, ", prefetchable"))
> - pref = true;
> + *pref = true;
> }
> }
> fwts_list_free(lspci_output, free);
>
> - return pref;
> + return FWTS_OK;
> }
>
> -static void guess_cache_type(fwts_framework *fw, char *string, int *must, int *mustnot, uint64_t address)
> +static int guess_cache_type(
> + fwts_framework *fw,
> + char *string,
> + int *must,
> + int *mustnot,
> + uint64_t address)
> {
> *must = 0;
> *mustnot = 0;
> @@ -232,11 +245,16 @@ static void guess_cache_type(fwts_framework *fw, char *string, int *must, int *m
> if (strstr(string, "System RAM")) {
> *must = WRITE_BACK;
> *mustnot = ~WRITE_BACK;
> - return;
> + return FWTS_OK;
> }
> /* if it's PCI mmio -> uncached typically except for video */
> if (strstr(string, "0000:")) {
> - if (is_prefetchable(fw, string, address)) {
> + bool pref;
> +
> + if (check_prefetchable(fw, string, address, &pref) != FWTS_OK)
> + return FWTS_ERROR;
> +
> + if (pref) {
> *must = 0;
> *mustnot = WRITE_BACK | UNCACHED;
> } else {
> @@ -244,6 +262,8 @@ static void guess_cache_type(fwts_framework *fw, char *string, int *must, int *m
> *mustnot = (~UNCACHED) & (~DEFAULT);
> }
> }
> +
> + return FWTS_OK;
> }
>
> static int validate_iomem(fwts_framework *fw)
> @@ -310,7 +330,13 @@ static int validate_iomem(fwts_framework *fw)
>
> type = cache_types(start, end);
>
> - guess_cache_type(fw, c2, &type_must, &type_mustnot, start);
> + if (guess_cache_type(fw, c2, &type_must, &type_mustnot, start) != FWTS_OK) {
> + /* This has failed, give up at this point */
> + fwts_skipped(fw,
> + "Could not guess cache type, lspci seems to be failing.");
> + fclose(file);
> + return FWTS_ERROR;
> + }
>
> if ((type & type_mustnot)!=0) {
> failed++;
>
Acked-by: Alex Hung <alex.hung at canonical.com>
More information about the fwts-devel
mailing list