crossystem: allow last nvdata entry to be filled

Mosys used to have code (below), which led me to believe that we
always try and leave the last entry unfilled:

        memset(blank, 0xff, VBNV_BLOCK_SIZE);
        for (index = 0; index < len / VBNV_BLOCK_SIZE; index++) {
                unsigned int offset = index * VBNV_BLOCK_SIZE;
                if (!memcmp(blank, &data[offset], VBNV_BLOCK_SIZE))

        if (index == 0) {
                lprintf(LOG_ERR, "VBNV is uninitialized\n");
                return -1;
        } else if (index >= len) {  <---- SEE NOTE
                lprintf(LOG_ERR, "VBNV is full\n");   <--- unreachable
                return -1;
        } else {
                return index - 1;

The statement at "SEE NOTE" will always be false, so this code fooled
me to believe that we consider VBNV without a row of 0xFF*16 to be

And so I implemented and wrote unit tests for what I believed the
correct behavior to be :/

Anyway, this is causing us issues since AP firmware does not implement
it that way.  So allow the last row to be filled.

TEST=unit tests

Signed-off-by: Jack Rosenthal <>
Change-Id: Ib3da78eddef69a688d081cdb5391a25000dac9d3
Reviewed-by: Hung-Te Lin <>
2 files changed