blob: 30739ef82b510316d565c9d8494b16586ce045e3 [file] [log] [blame]
Andrew Jefferyd083efd2018-02-21 21:19:00 +10301/* SPDX-License-Identifier: Apache-2.0 */
2/* Copyright (C) 2018 IBM Corp. */
3
William A. Kennington IIId5f1d402018-10-11 13:55:04 -07004#include "config.h"
5
Andrew Jeffery261f61a2019-03-14 09:57:28 +10306extern "C" {
Evan Lojewskif1e547c2019-03-14 14:34:33 +10307#include "backend.h"
Andrew Jeffery261f61a2019-03-14 09:57:28 +10308#include "mboxd.h"
9}
10
Andrew Jefferyde08ca22019-03-18 13:23:46 +103011#include "vpnor/table.hpp"
William A. Kennington IIId5f1d402018-10-11 13:55:04 -070012
Andrew Jeffery261f61a2019-03-14 09:57:28 +103013#include <cassert>
14#include <cstring>
Patrick Williams150be912022-06-16 16:46:09 -050015#include <filesystem>
William A. Kennington IIId5f1d402018-10-11 13:55:04 -070016#include <fstream>
17#include <vector>
18
Andrew Jefferyd083efd2018-02-21 21:19:00 +103019namespace openpower
20{
21namespace virtual_pnor
22{
23namespace test
24{
25
Patrick Williams150be912022-06-16 16:46:09 -050026namespace fs = std::filesystem;
Andrew Jeffery812923d2018-02-22 11:59:52 +103027
28class VpnorRoot
Andrew Jefferyd083efd2018-02-21 21:19:00 +103029{
Andrew Jeffery812923d2018-02-22 11:59:52 +103030 public:
31 template <std::size_t N>
Evan Lojewskif1e547c2019-03-14 14:34:33 +103032 VpnorRoot(struct backend* backend, const std::string (&toc)[N],
Ninad Palsule81365bf2024-10-25 09:20:21 -050033 size_t blockSize) : backend(backend)
Andrew Jefferyd083efd2018-02-21 21:19:00 +103034 {
Andrew Jeffery812923d2018-02-22 11:59:52 +103035 char tmplt[] = "/tmp/vpnor_root.XXXXXX";
36 char* tmpdir = mkdtemp(tmplt);
37 root = fs::path{tmpdir};
Andrew Jefferyd083efd2018-02-21 21:19:00 +103038
Andrew Jeffery097495c2018-02-22 11:36:13 +103039 for (const auto& attr : attributes)
40 {
41 fs::create_directory(root / attr);
42 }
43
44 fs::path tocFilePath = root / "ro" / PARTITION_TOC_FILE;
Andrew Jefferyd083efd2018-02-21 21:19:00 +103045
Andrew Jeffery812923d2018-02-22 11:59:52 +103046 for (const std::string& line : toc)
47 {
48 pnor_partition part;
Andrew Jefferyd083efd2018-02-21 21:19:00 +103049
Andrew Jeffery812923d2018-02-22 11:59:52 +103050 openpower::virtual_pnor::parseTocLine(line, blockSize, part);
51
52 /* Populate the partition in the tree */
Andrew Jeffery097495c2018-02-22 11:36:13 +103053 std::vector<char> zeroed(part.data.actual, 0);
54 fs::path partitionFilePath = root / "ro" / part.data.name;
55 std::ofstream(partitionFilePath)
56 .write(zeroed.data(), zeroed.size());
Andrew Jeffery812923d2018-02-22 11:59:52 +103057
58 /* Update the ToC if the partition file was created */
Andrew Jeffery097495c2018-02-22 11:36:13 +103059 std::ofstream(tocFilePath, std::ofstream::app) << line << "\n";
Andrew Jeffery812923d2018-02-22 11:59:52 +103060 }
Andrew Jeffery32476cb2018-02-22 15:34:17 +103061
Evan Lojewskif1e547c2019-03-14 14:34:33 +103062 vpnor_partition_paths paths{};
63
64 snprintf(paths.ro_loc, PATH_MAX - 1, "%s/ro", root.c_str());
65 paths.ro_loc[PATH_MAX - 1] = '\0';
66 snprintf(paths.rw_loc, PATH_MAX - 1, "%s/rw", root.c_str());
67 paths.rw_loc[PATH_MAX - 1] = '\0';
68 snprintf(paths.prsv_loc, PATH_MAX - 1, "%s/prsv", root.c_str());
69 paths.prsv_loc[PATH_MAX - 1] = '\0';
70 snprintf(paths.patch_loc, PATH_MAX - 1, "%s/patch", root.c_str());
71 paths.patch_loc[PATH_MAX - 1] = '\0';
72
73 if (backend_probe_vpnor(backend, &paths))
74 {
75 throw std::system_error(errno, std::system_category());
76 }
Andrew Jefferyd083efd2018-02-21 21:19:00 +103077 }
78
Andrew Jeffery812923d2018-02-22 11:59:52 +103079 VpnorRoot(const VpnorRoot&) = delete;
80 VpnorRoot& operator=(const VpnorRoot&) = delete;
81 VpnorRoot(VpnorRoot&&) = delete;
82 VpnorRoot& operator=(VpnorRoot&&) = delete;
83
84 ~VpnorRoot()
85 {
Evan Lojewskif1e547c2019-03-14 14:34:33 +103086 backend_free(backend);
Andrew Jeffery812923d2018-02-22 11:59:52 +103087 fs::remove_all(root);
88 }
Andrew Jeffery097495c2018-02-22 11:36:13 +103089 fs::path ro()
Andrew Jeffery812923d2018-02-22 11:59:52 +103090 {
Andrew Jeffery097495c2018-02-22 11:36:13 +103091 return fs::path{root} / "ro";
92 }
93 fs::path rw()
94 {
95 return fs::path{root} / "rw";
96 }
97 fs::path prsv()
98 {
99 return fs::path{root} / "prsv";
100 }
101 fs::path patch()
102 {
103 return fs::path{root} / "patch";
Andrew Jeffery812923d2018-02-22 11:59:52 +1030104 }
105 size_t write(const std::string& name, const void* data, size_t len);
Andrew Jeffery2a4bee72018-03-01 15:49:17 +1030106 size_t patch(const std::string& name, const void* data, size_t len);
Andrew Jeffery812923d2018-02-22 11:59:52 +1030107
108 private:
Evan Lojewskif1e547c2019-03-14 14:34:33 +1030109 struct backend* backend;
Andrew Jeffery812923d2018-02-22 11:59:52 +1030110 fs::path root;
Andrew Jeffery097495c2018-02-22 11:36:13 +1030111 const std::string attributes[4] = {"ro", "rw", "prsv", "patch"};
Andrew Jeffery812923d2018-02-22 11:59:52 +1030112};
Andrew Jefferyd083efd2018-02-21 21:19:00 +1030113
Andrew Jeffery7a03b072018-09-05 17:34:49 +0930114} // namespace test
115} // namespace virtual_pnor
116} // namespace openpower