diff options
-rw-r--r-- | hw/mac_nvram.c | 51 | ||||
-rw-r--r-- | qemu-doc.texi | 12 | ||||
-rw-r--r-- | sysemu.h | 2 | ||||
-rw-r--r-- | vl.c | 6 |
4 files changed, 47 insertions, 24 deletions
diff --git a/hw/mac_nvram.c b/hw/mac_nvram.c index 3787f54d65..773f2d8aec 100644 --- a/hw/mac_nvram.c +++ b/hw/mac_nvram.c @@ -23,6 +23,8 @@ * THE SOFTWARE. */ #include "hw.h" +#include "firmware_abi.h" +#include "sysemu.h" #include "ppc_mac.h" /* debug NVR */ @@ -122,26 +124,35 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) cpu_register_physical_memory(mem_base, s->size, s->mem_index); } -static uint8_t nvram_chksum (const uint8_t *buf, int n) -{ - int sum, i; - sum = 0; - for(i = 0; i < n; i++) - sum += buf[i]; - return (sum & 0xff) + (sum >> 8); -} - -/* set a free Mac OS NVRAM partition */ +/* Set up a system OpenBIOS NVRAM partition */ void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len) { - uint8_t *buf; - char partition_name[12] = "wwwwwwwwwwww"; - - buf = nvr->data; - buf[0] = 0x7f; /* free partition magic */ - buf[1] = 0; /* checksum */ - buf[2] = len >> 8; - buf[3] = len; - memcpy(buf + 4, partition_name, 12); - buf[1] = nvram_chksum(buf, 16); + unsigned int i; + uint32_t start = 0, end; + struct OpenBIOS_nvpart_v1 *part_header; + + // OpenBIOS nvram variables + // Variable partition + part_header = (struct OpenBIOS_nvpart_v1 *)nvr->data; + part_header->signature = OPENBIOS_PART_SYSTEM; + pstrcpy(part_header->name, sizeof(part_header->name), "system"); + + end = start + sizeof(struct OpenBIOS_nvpart_v1); + for (i = 0; i < nb_prom_envs; i++) + end = OpenBIOS_set_var(nvr->data, end, prom_envs[i]); + + // End marker + nvr->data[end++] = '\0'; + + end = start + ((end - start + 15) & ~15); + OpenBIOS_finish_partition(part_header, end - start); + + // free partition + start = end; + part_header = (struct OpenBIOS_nvpart_v1 *)&nvr->data[start]; + part_header->signature = OPENBIOS_PART_FREE; + pstrcpy(part_header->name, sizeof(part_header->name), "free"); + + end = len; + OpenBIOS_finish_partition(part_header, end - start); } diff --git a/qemu-doc.texi b/qemu-doc.texi index 7156b2db2d..0f1e7ccf5a 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -2343,6 +2343,18 @@ The following options are specific to the PowerPC emulation: Set the initial VGA graphic mode. The default is 800x600x15. +@item -prom-env string + +Set OpenBIOS variables in NVRAM, for example: + +@example +qemu-system-ppc -prom-env 'auto-boot?=false' \ + -prom-env 'boot-device=hd:2,\yaboot' \ + -prom-env 'boot-args=conf=hd:2,\yaboot.conf' +@end example + +These variables are not used by Open Hack'Ware. + @end table @c man end @@ -108,7 +108,7 @@ extern int kqemu_allowed; extern const char *option_rom[MAX_OPTION_ROMS]; extern int nb_option_roms; -#ifdef TARGET_SPARC +#if defined(TARGET_SPARC) || defined(TARGET_PPC) #define MAX_PROM_ENVS 128 extern const char *prom_envs[MAX_PROM_ENVS]; extern unsigned int nb_prom_envs; @@ -231,7 +231,7 @@ int old_param = 0; #endif const char *qemu_name; int alt_grab = 0; -#ifdef TARGET_SPARC +#if defined(TARGET_SPARC) || defined(TARGET_PPC) unsigned int nb_prom_envs = 0; const char *prom_envs[MAX_PROM_ENVS]; #endif @@ -4185,7 +4185,7 @@ static const QEMUOption qemu_options[] = { { "semihosting", 0, QEMU_OPTION_semihosting }, #endif { "name", HAS_ARG, QEMU_OPTION_name }, -#if defined(TARGET_SPARC) +#if defined(TARGET_SPARC) || defined(TARGET_PPC) { "prom-env", HAS_ARG, QEMU_OPTION_prom_env }, #endif #if defined(TARGET_ARM) @@ -5049,7 +5049,7 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_name: qemu_name = optarg; break; -#ifdef TARGET_SPARC +#if defined(TARGET_SPARC) || defined(TARGET_PPC) case QEMU_OPTION_prom_env: if (nb_prom_envs >= MAX_PROM_ENVS) { fprintf(stderr, "Too many prom variables\n"); |