blob: ba286bea3f58c617972bc21414b01bbd436ba964 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/*
* Copyright 2013-2019 IBM Corp.
*/
#include <stdlib.h>
#include "../nvram-format.c"
bool nvram_wait_for_load(void)
{
return true;
}
bool nvram_validate(void)
{
return true;
}
bool nvram_has_loaded(void)
{
return true;
}
static char *nvram_reset(void *nvram_image, int size)
{
struct chrp_nvram_hdr *h = nvram_image;
/* entire partition used by one key */
assert(nvram_format(nvram_image, size) == 0);
memset((char *) h + sizeof(*h), 0, NVRAM_SIZE_FW_PRIV - sizeof(*h));
assert(nvram_check(nvram_image, size) == 0);
return (char *) h + sizeof(*h);
}
int main(void)
{
char *nvram_image;
size_t sz;
struct chrp_nvram_hdr *h;
char *data;
const char *result;
/* 1024 bytes is too small for our NVRAM */
nvram_image = malloc(1024);
assert(nvram_format(nvram_image, 1024)!=0);
free(nvram_image);
/* 4096 bytes is too small for our NVRAM */
nvram_image = malloc(4096);
assert(nvram_format(nvram_image, 4096)!=0);
free(nvram_image);
/* 64k is too small for our NVRAM */
nvram_image = malloc(0x10000);
assert(nvram_format(nvram_image, 0x10000)!=0);
free(nvram_image);
/* 68k is too small for our NVRAM */
nvram_image = malloc(68*1024);
assert(nvram_format(nvram_image, 68*1024)!=0);
free(nvram_image);
/* 68k+16 bytes (nvram header) should generate empty free space */
sz = NVRAM_SIZE_COMMON + NVRAM_SIZE_FW_PRIV
+ sizeof(struct chrp_nvram_hdr);
nvram_image = malloc(sz);
assert(nvram_format(nvram_image, sz)==0);
assert(nvram_check(nvram_image, sz)==0);
assert(nvram_image[sz-14]==0);
assert(nvram_image[sz-13]==1);
h = (struct chrp_nvram_hdr*)(&nvram_image[NVRAM_SIZE_COMMON + NVRAM_SIZE_FW_PRIV]);
assert(memcmp(h->name, "wwwwwwwwwwww", 12)==0);
free(nvram_image);
/* 128k NVRAM check */
nvram_image = malloc(128*1024);
assert(nvram_format(nvram_image, 128*1024)==0);
assert(nvram_check(nvram_image,128*1024)==0);
/* Now, we corrupt it */
nvram_image[0] = 0;
assert(nvram_check(nvram_image,128*1024) != 0);
/* Does our NUL checking work? */
assert(nvram_format(nvram_image, 128 * 1024) == 0);
h = (struct chrp_nvram_hdr *) nvram_image;
memset((char *) h + sizeof(*h), 0xFF, be16_to_cpu(h->len) * 16 - sizeof(*h));
assert(nvram_check(nvram_image, 128 * 1024) != 0);
assert(nvram_format(nvram_image, 128*1024)==0);
/* corrupt the length of the partition */
nvram_image[2] = 0;
nvram_image[3] = 0;
assert(nvram_check(nvram_image,128*1024) != 0);
assert(nvram_format(nvram_image, 128*1024)==0);
/* corrupt the length of the partition */
nvram_image[2] = 0;
nvram_image[3] = 0;
/* but reset checksum! */
h = (struct chrp_nvram_hdr*)nvram_image;
h->cksum = chrp_nv_cksum(h);
assert(nvram_check(nvram_image,128*1024) != 0);
assert(nvram_format(nvram_image, 128*1024)==0);
/* make the length insanely beyond end of nvram */
nvram_image[2] = 42;
nvram_image[3] = 32;
/* but reset checksum! */
h = (struct chrp_nvram_hdr*)nvram_image;
h->cksum = chrp_nv_cksum(h);
assert(nvram_check(nvram_image,128*1024) != 0);
assert(nvram_format(nvram_image, 128*1024)==0);
/* remove skiboot partition */
nvram_image[12] = '\0';
/* but reset checksum! */
h = (struct chrp_nvram_hdr*)nvram_image;
h->cksum = chrp_nv_cksum(h);
assert(nvram_check(nvram_image,128*1024) != 0);
assert(nvram_format(nvram_image, 128*1024)==0);
/* remove common partition */
nvram_image[NVRAM_SIZE_FW_PRIV+5] = '\0';
/* but reset checksum! */
h = (struct chrp_nvram_hdr*)(&nvram_image[NVRAM_SIZE_FW_PRIV]);
h->cksum = chrp_nv_cksum(h);
assert(nvram_check(nvram_image,128*1024) != 0);
/* test nvram_query() */
/* does an empty partition break us? */
data = nvram_reset(nvram_image, 128*1024);
assert(nvram_query_safe("test") == NULL);
/* does a zero length key break us? */
data = nvram_reset(nvram_image, 128*1024);
data[0] = '=';
assert(nvram_query_safe("test") == NULL);
/* does a missing = break us? */
data = nvram_reset(nvram_image, 128*1024);
data[0] = 'a';
assert(nvram_query_safe("test") == NULL);
/* does an empty value break us? */
data = nvram_reset(nvram_image, 128*1024);
data[0] = 'a';
data[1] = '=';
result = nvram_query_safe("a");
assert(result);
assert(strlen(result) == 0);
/* do we trip over malformed keys? */
data = nvram_reset(nvram_image, 128*1024);
#define TEST_1 "a\0a=\0test=test\0"
memcpy(data, TEST_1, sizeof(TEST_1));
result = nvram_query_safe("test");
assert(result);
assert(strcmp(result, "test") == 0);
free(nvram_image);
return 0;
}