blob: 12dd2e675df370538ac465c89cc5a5f85f4e21af [file] [log] [blame]
Andrew Jeffery4fe996c2018-02-27 12:16:48 +10301// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2018 IBM Corp.
Deepak Kodihalli393821d2017-04-28 04:44:38 -05003#include "pnor_partition_table.hpp"
4#include "config.h"
5#include <assert.h>
6#include <string.h>
7#include <vector>
8#include <fstream>
9#include <experimental/filesystem>
10
Deepak Kodihallie8b0e8a2017-07-12 10:01:31 -050011constexpr auto line = "partition01=HBB,00000000,00000400,80,ECC,PRESERVED";
Deepak Kodihalli393821d2017-04-28 04:44:38 -050012constexpr auto partitionName = "HBB";
13char tmplt[] = "/tmp/vpnor_partitions.XXXXXX";
14
15int main()
16{
17 namespace fs = std::experimental::filesystem;
18
19 char* tmpdir = mkdtemp(tmplt);
20 assert(tmpdir != nullptr);
21
22 fs::path tocFilePath{tmpdir};
23 tocFilePath /= PARTITION_TOC_FILE;
24 std::ofstream tocFile(tocFilePath.c_str());
25 tocFile.write(line, strlen(line));
26 tocFile.close();
27
28 fs::path partitionFilePath{tmpdir};
29 partitionFilePath /= partitionName;
30 std::ofstream partitionFile(partitionFilePath.c_str());
31 std::vector<char> empty(1, 0); // 1 byte file
32 partitionFile.write(empty.data(), empty.size());
33 partitionFile.close();
34
Andrew Jefferyf34db312018-03-09 15:27:03 +103035 const openpower::virtual_pnor::partition::Table table(
36 fs::path{tmpdir}, 4 * 1024, 64 * 1024 * 1024);
Deepak Kodihalli393821d2017-04-28 04:44:38 -050037
38 pnor_partition_table expectedTable{};
39 expectedTable.data.magic = PARTITION_HEADER_MAGIC;
40 expectedTable.data.version = PARTITION_VERSION_1;
41 expectedTable.data.size = 1; // 1 block
42 expectedTable.data.entry_size = sizeof(pnor_partition);
43 expectedTable.data.entry_count = 1; // 1 partition
44 expectedTable.data.block_size = 4096;
Deepak Kodihallid1d79302017-07-11 23:01:39 -050045 expectedTable.data.block_count =
46 (64 * 1024 * 1024) / expectedTable.data.block_size;
Deepak Kodihalli393821d2017-04-28 04:44:38 -050047 expectedTable.checksum =
48 openpower::virtual_pnor::details::checksum(expectedTable.data);
49
50 pnor_partition expectedPartition{};
51 strcpy(expectedPartition.data.name, partitionName);
Andrew Jefferyf34db312018-03-09 15:27:03 +103052 expectedPartition.data.base = 0; // starts at offset 0
53 expectedPartition.data.size = 1; // 1 block
Deepak Kodihalli393821d2017-04-28 04:44:38 -050054 expectedPartition.data.actual = 0x400; // 1024 bytes
55 expectedPartition.data.id = 1;
56 expectedPartition.data.pid = PARENT_PATITION_ID;
57 expectedPartition.data.type = PARTITION_TYPE_DATA;
58 expectedPartition.data.flags = 0;
59 expectedPartition.data.user.data[0] = PARTITION_ECC_PROTECTED;
60 expectedPartition.data.user.data[1] |= PARTITION_PRESERVED;
Deepak Kodihallie8b0e8a2017-07-12 10:01:31 -050061 expectedPartition.data.user.data[1] |= PARTITION_VERSION_CHECK_SHA512;
Deepak Kodihalli393821d2017-04-28 04:44:38 -050062 expectedPartition.checksum =
63 openpower::virtual_pnor::details::checksum(expectedPartition.data);
64
65 const pnor_partition_table& result = table.getNativeTable();
66
67 fs::remove_all(fs::path{tmpdir});
68
69 auto rc = memcmp(&expectedTable, &result, sizeof(pnor_partition_table));
70 assert(rc == 0);
71
72 rc = memcmp(&expectedPartition, &result.partitions[0],
73 sizeof(pnor_partition));
74 assert(rc == 0);
75
Adriana Kobylak2ad21322017-11-28 14:59:19 -060076 const pnor_partition& first = table.partition(0); // Partition at offset 0
Deepak Kodihalli393821d2017-04-28 04:44:38 -050077 rc = memcmp(&first, &result.partitions[0], sizeof(pnor_partition));
78 assert(rc == 0);
79
80 return 0;
81}