2
* Common Hardware Reference Platform NVRAM helper functions.
4
* The CHRP NVRAM layout is used by OpenBIOS and SLOF. See CHRP
5
* specification, chapter 8, or the LoPAPR specification for details
6
* about the NVRAM layout.
8
* This code is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published
10
* by the Free Software Foundation; either version 2 of the License,
11
* or (at your option) any later version.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, see <http://www.gnu.org/licenses/>.
22
#include "qemu/osdep.h"
23
#include "qemu/cutils.h"
24
#include "qemu/error-report.h"
25
#include "hw/nvram/chrp_nvram.h"
26
#include "sysemu/sysemu.h"
28
static int chrp_nvram_set_var(uint8_t *nvram, int addr, const char *str,
33
len = strlen(str) + 1;
39
memcpy(&nvram[addr], str, len);
45
* Create a "system partition", used for the Open Firmware
46
* environment variables.
48
int chrp_nvram_create_system_partition(uint8_t *data, int min_len, int max_len)
50
ChrpNvramPartHdr *part_header;
54
if (max_len < sizeof(*part_header)) {
58
part_header = (ChrpNvramPartHdr *)data;
59
part_header->signature = CHRP_NVPART_SYSTEM;
60
pstrcpy(part_header->name, sizeof(part_header->name), "system");
62
end = sizeof(ChrpNvramPartHdr);
63
for (i = 0; i < nb_prom_envs; i++) {
64
end = chrp_nvram_set_var(data, end, prom_envs[i], max_len - end);
73
end = (end + 15) & ~15;
74
/* XXX: OpenBIOS is not able to grow up a partition. Leave some space for
79
chrp_nvram_finish_partition(part_header, end);
84
error_report("NVRAM is too small. Try to pass less data to -prom-env");
89
* Create a "free space" partition
91
int chrp_nvram_create_free_partition(uint8_t *data, int len)
93
ChrpNvramPartHdr *part_header;
95
part_header = (ChrpNvramPartHdr *)data;
96
part_header->signature = CHRP_NVPART_FREE;
97
pstrcpy(part_header->name, sizeof(part_header->name), "free");
99
chrp_nvram_finish_partition(part_header, len);