Skip to content

Commit

Permalink
Unit Tests For NVRAM Checking/Reading
Browse files Browse the repository at this point in the history
This change introduces the unit tests for testing the ported
NVRAM checking and reading logic. nvram_format was also ported
to be able to format the test NVRAM "partition" to then run
the tests on it.

Change-Id: Idca01dc84d43caf0e32ba556b6407c78d66f053a
RTC: 192411
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68612
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Roland Veloz <rveloz@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
Ilya Smirnov authored and dcrowell77 committed Jan 4, 2019
1 parent 24f66ec commit 36bd1da
Show file tree
Hide file tree
Showing 8 changed files with 230 additions and 7 deletions.
3 changes: 3 additions & 0 deletions src/include/usr/isteps/istep21list.H
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ const DepModInfo g_istep21Dependancies = {
#ifdef CONFIG_HTMGT
DEP_LIB(libhtmgt.so),
DEP_LIB(libisteps_mss.so),
#endif
#ifndef CONFIG_FSP_BUILD
DEP_LIB(libnvram.so),
#endif
NULL
}
Expand Down
10 changes: 10 additions & 0 deletions src/include/usr/nvram/import/nvram.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@

#include <stdint.h>

typedef uint16_t beint16_t;
typedef beint16_t be16;

struct chrp_nvram_hdr {
uint8_t sig;
uint8_t cksum;
be16 len;
char name[12];
};

extern "C"
{
int nvram_format(void *nvram_image, uint32_t nvram_size);
Expand Down
10 changes: 10 additions & 0 deletions src/include/usr/nvram/import/skiboot.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,22 @@ typedef uint16_t beint16_t;
typedef beint16_t be16;

#define BE16_TO_CPU(le_val) ((uint16_t)(le_val))
#define CPU_TO_BE16(native) ((beint16_t)(native))

static inline uint16_t be16_to_cpu(beint16_t be_val)
{
return BE16_TO_CPU(be_val);
}

/**
* cpu_to_be16 - convert a uint16_t value to big endian.
* @native: value to convert
*/
static inline beint16_t cpu_to_be16(uint16_t native)
{
return CPU_TO_BE16(native);
}

// For console logging
#define PR_EMERG 0
#define PR_ALERT 1
Expand Down
1 change: 1 addition & 0 deletions src/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ TESTCASE_MODULES += testscom
TESTCASE_MODULES += $(if $(CONFIG_VPO_COMPILE),,testruntime)
TESTCASE_MODULES += testintr
TESTCASE_MODULES += testfapi2
TESTCASE_MODULES += $(if $(CONFIG_FSP_BUILD),,testnvram)

#******************************************************************
#KNOWN ISSUES (I might let these run but there is something wrong)
Expand Down
79 changes: 72 additions & 7 deletions src/usr/nvram/import/nvram-format.C
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,6 @@
#include <skiboot.h>
#include <nvram.h>

struct chrp_nvram_hdr {
uint8_t sig;
uint8_t cksum;
be16 len;
char name[12];
};

static struct chrp_nvram_hdr *skiboot_part_hdr;

static uint8_t chrp_nv_cksum(struct chrp_nvram_hdr *hdr)
Expand All @@ -54,10 +47,82 @@ static uint8_t chrp_nv_cksum(struct chrp_nvram_hdr *hdr)

#define NVRAM_SIG_FW_PRIV 0x51
#define NVRAM_SIG_SYSTEM 0x70
#define NVRAM_SIG_FREE 0x7f
#define NVRAM_NAME_COMMON "common"
#define NVRAM_NAME_FW_PRIV "ibm,skiboot"
#define NVRAM_NAME_FREE "wwwwwwwwwwww"
#define NVRAM_SIZE_COMMON 0x10000
#define NVRAM_SIZE_FW_PRIV 0x1000

int nvram_format(void *nvram_image, uint32_t nvram_size)
{
struct chrp_nvram_hdr *h;
unsigned int offset = 0;

prerror("NVRAM: Re-initializing (size: 0x%08x)\n", nvram_size);
memset(nvram_image, 0, nvram_size);

/* Create private partition */
if (nvram_size - offset < NVRAM_SIZE_FW_PRIV)
return -1;
h =
#ifdef __HOSTBOOT_MODULE
reinterpret_cast<chrp_nvram_hdr*>(
static_cast<uint8_t*>(nvram_image) + offset);
#else
nvram_image + offset;
#endif
h->sig = NVRAM_SIG_FW_PRIV;
h->len = cpu_to_be16(NVRAM_SIZE_FW_PRIV >> 4);
strcpy(h->name, NVRAM_NAME_FW_PRIV);
h->cksum = chrp_nv_cksum(h);
prlog(PR_DEBUG, "NVRAM: Created '%s' partition at 0x%08x"
" for size 0x%08x with cksum 0x%02x\n",
NVRAM_NAME_FW_PRIV, offset,
be16_to_cpu(h->len), h->cksum);
offset += NVRAM_SIZE_FW_PRIV;

/* Create common partition */
if (nvram_size - offset < NVRAM_SIZE_COMMON)
return -1;
h =
#ifdef __HOSTBOOT_MODULE
reinterpret_cast<chrp_nvram_hdr*>(
static_cast<uint8_t*>(nvram_image) + offset);
#else
nvram_image + offset;
#endif
h->sig = NVRAM_SIG_SYSTEM;
h->len = cpu_to_be16(NVRAM_SIZE_COMMON >> 4);
strcpy(h->name, NVRAM_NAME_COMMON);
h->cksum = chrp_nv_cksum(h);
prlog(PR_DEBUG, "NVRAM: Created '%s' partition at 0x%08x"
" for size 0x%08x with cksum 0x%02x\n",
NVRAM_NAME_COMMON, offset,
be16_to_cpu(h->len), h->cksum);
offset += NVRAM_SIZE_COMMON;

/* Create free space partition */
if (nvram_size - offset < sizeof(struct chrp_nvram_hdr))
return -1;
h =
#ifdef __HOSTBOOT_MODULE
reinterpret_cast<chrp_nvram_hdr*>(
static_cast<uint8_t*>(nvram_image) + offset);
#else
nvram_image + offset;
#endif
h->sig = NVRAM_SIG_FREE;
h->len = cpu_to_be16((nvram_size - offset) >> 4);
/* We have the full 12 bytes here */
memcpy(h->name, NVRAM_NAME_FREE, 12);
h->cksum = chrp_nv_cksum(h);
prlog(PR_DEBUG, "NVRAM: Created '%s' partition at 0x%08x"
" for size 0x%08x with cksum 0x%02x\n",
NVRAM_NAME_FREE, offset, be16_to_cpu(h->len), h->cksum);
return 0;
}

static const char *find_next_key(const char *start, const char *end)
{
/*
Expand Down
2 changes: 2 additions & 0 deletions src/usr/nvram/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,6 @@ OBJS += nvram-format.o

VPATH += import

SUBDIRS += test.d

include ${ROOTPATH}/config.mk
32 changes: 32 additions & 0 deletions src/usr/nvram/test/makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/usr/nvram/test/makefile $
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2018
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG
ROOTPATH = ../../../..

MODULE = testnvram

TESTS = testnvram.H

include ${ROOTPATH}/config.mk

100 changes: 100 additions & 0 deletions src/usr/nvram/test/testnvram.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/nvram/test/testnvram.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
#ifndef __TEST_NVRAM_H
#define __TEST_NVRAM_H

#include <cxxtest/TestSuite.H>
#include <nvram/import/nvram.h>
#include <stdlib.h>
#include <string.h>

class NvramTestSuite : public CxxTest::TestSuite
{
public:

void testNvram() const
{
TS_INFO(ENTER_MRK"testNvram");

const uint32_t NVRAM_SIZE = 0x90000;
uint8_t* l_nvramImg = static_cast<uint8_t*>(malloc(NVRAM_SIZE));

// Unformatted NVRAM - the check should fail
int l_rc = nvram_check(l_nvramImg, NVRAM_SIZE);
if(l_rc == 0)
{
TS_FAIL("testNvram: nvram_check returned clean on unformatted NVRAM");
}

// Format the memory area to look like NVRAM from skiboot perspective
l_rc = nvram_format(l_nvramImg, NVRAM_SIZE);
if(l_rc)
{
TS_FAIL("testNvram: could not nvram_format; rc = %d", l_rc);
}

// Now check it
l_rc = nvram_check(l_nvramImg, NVRAM_SIZE);
if(l_rc)
{
TS_FAIL("testNvram: nvram_check failed; rc = %d", l_rc);
}

char l_test_kv[] = "test=val";

// Insert the test K/V right after the header
memcpy(l_nvramImg + sizeof(chrp_nvram_hdr), l_test_kv,
sizeof(l_test_kv)/sizeof(l_test_kv[0]));

const char* l_key = "test";
const char* l_expectedVal = "val";
const char* l_val = nvram_query(l_key);
if(!l_val)
{
TS_FAIL("testNvram: test key not found!");
}
else
{
if(strcmp(l_val, l_expectedVal))
{
TS_FAIL("testNvram: unexpected test value returned. Expected \"%s\", actual \"%s\"", l_expectedVal, l_val);
}
}

const char* l_notExistingKey = "key_dne";
l_val = nvram_query(l_notExistingKey);
if(l_val)
{
TS_FAIL("testNvram: non-existing key found!");
}

free(l_nvramImg);
l_nvramImg = nullptr;

TS_INFO(EXIT_MRK"testNvram");
}
};

#endif

0 comments on commit 36bd1da

Please sign in to comment.