1 /* 2 * Common Hardware Reference Platform NVRAM helper functions. 3 * 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. 7 * 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. 12 * 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. 17 * 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/>. 20 */ 21 22 #include "qemu/osdep.h" 23 #include "qemu/cutils.h" 24 #include "hw/hw.h" 25 #include "hw/nvram/chrp_nvram.h" 26 #include "sysemu/sysemu.h" 27 28 static int chrp_nvram_set_var(uint8_t *nvram, int addr, const char *str) 29 { 30 int len; 31 32 len = strlen(str) + 1; 33 memcpy(&nvram[addr], str, len); 34 35 return addr + len; 36 } 37 38 /** 39 * Create a "system partition", used for the Open Firmware 40 * environment variables. 41 */ 42 int chrp_nvram_create_system_partition(uint8_t *data, int min_len) 43 { 44 ChrpNvramPartHdr *part_header; 45 unsigned int i; 46 int end; 47 48 part_header = (ChrpNvramPartHdr *)data; 49 part_header->signature = CHRP_NVPART_SYSTEM; 50 pstrcpy(part_header->name, sizeof(part_header->name), "system"); 51 52 end = sizeof(ChrpNvramPartHdr); 53 for (i = 0; i < nb_prom_envs; i++) { 54 end = chrp_nvram_set_var(data, end, prom_envs[i]); 55 } 56 57 /* End marker */ 58 data[end++] = '\0'; 59 60 end = (end + 15) & ~15; 61 /* XXX: OpenBIOS is not able to grow up a partition. Leave some space for 62 new variables. */ 63 if (end < min_len) { 64 end = min_len; 65 } 66 chrp_nvram_finish_partition(part_header, end); 67 68 return end; 69 } 70 71 /** 72 * Create a "free space" partition 73 */ 74 int chrp_nvram_create_free_partition(uint8_t *data, int len) 75 { 76 ChrpNvramPartHdr *part_header; 77 78 part_header = (ChrpNvramPartHdr *)data; 79 part_header->signature = CHRP_NVPART_FREE; 80 pstrcpy(part_header->name, sizeof(part_header->name), "free"); 81 82 chrp_nvram_finish_partition(part_header, len); 83 84 return len; 85 } 86