Commit 95efd11c121ed5ba9677f9fbaf0cefa8e52cb02e
1 parent
992e5acd
Add support for -prom-env command line options
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6129 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
47 additions
and
24 deletions
hw/mac_nvram.c
| @@ -23,6 +23,8 @@ | @@ -23,6 +23,8 @@ | ||
| 23 | * THE SOFTWARE. | 23 | * THE SOFTWARE. |
| 24 | */ | 24 | */ |
| 25 | #include "hw.h" | 25 | #include "hw.h" |
| 26 | +#include "firmware_abi.h" | ||
| 27 | +#include "sysemu.h" | ||
| 26 | #include "ppc_mac.h" | 28 | #include "ppc_mac.h" |
| 27 | 29 | ||
| 28 | /* debug NVR */ | 30 | /* debug NVR */ |
| @@ -122,26 +124,35 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) | @@ -122,26 +124,35 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) | ||
| 122 | cpu_register_physical_memory(mem_base, s->size, s->mem_index); | 124 | cpu_register_physical_memory(mem_base, s->size, s->mem_index); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| 125 | -static uint8_t nvram_chksum (const uint8_t *buf, int n) | ||
| 126 | -{ | ||
| 127 | - int sum, i; | ||
| 128 | - sum = 0; | ||
| 129 | - for(i = 0; i < n; i++) | ||
| 130 | - sum += buf[i]; | ||
| 131 | - return (sum & 0xff) + (sum >> 8); | ||
| 132 | -} | ||
| 133 | - | ||
| 134 | -/* set a free Mac OS NVRAM partition */ | 127 | +/* Set up a system OpenBIOS NVRAM partition */ |
| 135 | void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len) | 128 | void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len) |
| 136 | { | 129 | { |
| 137 | - uint8_t *buf; | ||
| 138 | - char partition_name[12] = "wwwwwwwwwwww"; | ||
| 139 | - | ||
| 140 | - buf = nvr->data; | ||
| 141 | - buf[0] = 0x7f; /* free partition magic */ | ||
| 142 | - buf[1] = 0; /* checksum */ | ||
| 143 | - buf[2] = len >> 8; | ||
| 144 | - buf[3] = len; | ||
| 145 | - memcpy(buf + 4, partition_name, 12); | ||
| 146 | - buf[1] = nvram_chksum(buf, 16); | 130 | + unsigned int i; |
| 131 | + uint32_t start = 0, end; | ||
| 132 | + struct OpenBIOS_nvpart_v1 *part_header; | ||
| 133 | + | ||
| 134 | + // OpenBIOS nvram variables | ||
| 135 | + // Variable partition | ||
| 136 | + part_header = (struct OpenBIOS_nvpart_v1 *)nvr->data; | ||
| 137 | + part_header->signature = OPENBIOS_PART_SYSTEM; | ||
| 138 | + pstrcpy(part_header->name, sizeof(part_header->name), "system"); | ||
| 139 | + | ||
| 140 | + end = start + sizeof(struct OpenBIOS_nvpart_v1); | ||
| 141 | + for (i = 0; i < nb_prom_envs; i++) | ||
| 142 | + end = OpenBIOS_set_var(nvr->data, end, prom_envs[i]); | ||
| 143 | + | ||
| 144 | + // End marker | ||
| 145 | + nvr->data[end++] = '\0'; | ||
| 146 | + | ||
| 147 | + end = start + ((end - start + 15) & ~15); | ||
| 148 | + OpenBIOS_finish_partition(part_header, end - start); | ||
| 149 | + | ||
| 150 | + // free partition | ||
| 151 | + start = end; | ||
| 152 | + part_header = (struct OpenBIOS_nvpart_v1 *)&nvr->data[start]; | ||
| 153 | + part_header->signature = OPENBIOS_PART_FREE; | ||
| 154 | + pstrcpy(part_header->name, sizeof(part_header->name), "free"); | ||
| 155 | + | ||
| 156 | + end = len; | ||
| 157 | + OpenBIOS_finish_partition(part_header, end - start); | ||
| 147 | } | 158 | } |
qemu-doc.texi
| @@ -2343,6 +2343,18 @@ The following options are specific to the PowerPC emulation: | @@ -2343,6 +2343,18 @@ The following options are specific to the PowerPC emulation: | ||
| 2343 | 2343 | ||
| 2344 | Set the initial VGA graphic mode. The default is 800x600x15. | 2344 | Set the initial VGA graphic mode. The default is 800x600x15. |
| 2345 | 2345 | ||
| 2346 | +@item -prom-env string | ||
| 2347 | + | ||
| 2348 | +Set OpenBIOS variables in NVRAM, for example: | ||
| 2349 | + | ||
| 2350 | +@example | ||
| 2351 | +qemu-system-ppc -prom-env 'auto-boot?=false' \ | ||
| 2352 | + -prom-env 'boot-device=hd:2,\yaboot' \ | ||
| 2353 | + -prom-env 'boot-args=conf=hd:2,\yaboot.conf' | ||
| 2354 | +@end example | ||
| 2355 | + | ||
| 2356 | +These variables are not used by Open Hack'Ware. | ||
| 2357 | + | ||
| 2346 | @end table | 2358 | @end table |
| 2347 | 2359 | ||
| 2348 | @c man end | 2360 | @c man end |
sysemu.h
| @@ -108,7 +108,7 @@ extern int kqemu_allowed; | @@ -108,7 +108,7 @@ extern int kqemu_allowed; | ||
| 108 | extern const char *option_rom[MAX_OPTION_ROMS]; | 108 | extern const char *option_rom[MAX_OPTION_ROMS]; |
| 109 | extern int nb_option_roms; | 109 | extern int nb_option_roms; |
| 110 | 110 | ||
| 111 | -#ifdef TARGET_SPARC | 111 | +#if defined(TARGET_SPARC) || defined(TARGET_PPC) |
| 112 | #define MAX_PROM_ENVS 128 | 112 | #define MAX_PROM_ENVS 128 |
| 113 | extern const char *prom_envs[MAX_PROM_ENVS]; | 113 | extern const char *prom_envs[MAX_PROM_ENVS]; |
| 114 | extern unsigned int nb_prom_envs; | 114 | extern unsigned int nb_prom_envs; |
vl.c
| @@ -231,7 +231,7 @@ int old_param = 0; | @@ -231,7 +231,7 @@ int old_param = 0; | ||
| 231 | #endif | 231 | #endif |
| 232 | const char *qemu_name; | 232 | const char *qemu_name; |
| 233 | int alt_grab = 0; | 233 | int alt_grab = 0; |
| 234 | -#ifdef TARGET_SPARC | 234 | +#if defined(TARGET_SPARC) || defined(TARGET_PPC) |
| 235 | unsigned int nb_prom_envs = 0; | 235 | unsigned int nb_prom_envs = 0; |
| 236 | const char *prom_envs[MAX_PROM_ENVS]; | 236 | const char *prom_envs[MAX_PROM_ENVS]; |
| 237 | #endif | 237 | #endif |
| @@ -4185,7 +4185,7 @@ static const QEMUOption qemu_options[] = { | @@ -4185,7 +4185,7 @@ static const QEMUOption qemu_options[] = { | ||
| 4185 | { "semihosting", 0, QEMU_OPTION_semihosting }, | 4185 | { "semihosting", 0, QEMU_OPTION_semihosting }, |
| 4186 | #endif | 4186 | #endif |
| 4187 | { "name", HAS_ARG, QEMU_OPTION_name }, | 4187 | { "name", HAS_ARG, QEMU_OPTION_name }, |
| 4188 | -#if defined(TARGET_SPARC) | 4188 | +#if defined(TARGET_SPARC) || defined(TARGET_PPC) |
| 4189 | { "prom-env", HAS_ARG, QEMU_OPTION_prom_env }, | 4189 | { "prom-env", HAS_ARG, QEMU_OPTION_prom_env }, |
| 4190 | #endif | 4190 | #endif |
| 4191 | #if defined(TARGET_ARM) | 4191 | #if defined(TARGET_ARM) |
| @@ -5049,7 +5049,7 @@ int main(int argc, char **argv, char **envp) | @@ -5049,7 +5049,7 @@ int main(int argc, char **argv, char **envp) | ||
| 5049 | case QEMU_OPTION_name: | 5049 | case QEMU_OPTION_name: |
| 5050 | qemu_name = optarg; | 5050 | qemu_name = optarg; |
| 5051 | break; | 5051 | break; |
| 5052 | -#ifdef TARGET_SPARC | 5052 | +#if defined(TARGET_SPARC) || defined(TARGET_PPC) |
| 5053 | case QEMU_OPTION_prom_env: | 5053 | case QEMU_OPTION_prom_env: |
| 5054 | if (nb_prom_envs >= MAX_PROM_ENVS) { | 5054 | if (nb_prom_envs >= MAX_PROM_ENVS) { |
| 5055 | fprintf(stderr, "Too many prom variables\n"); | 5055 | fprintf(stderr, "Too many prom variables\n"); |