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"); |