mips-malta: fix reset

(broken by 45a50b1668)

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Aurelien Jarno 2009-11-14 13:04:29 +01:00
parent 51cc2e783a
commit c938ada244
1 changed files with 26 additions and 24 deletions

View File

@ -655,41 +655,37 @@ static void write_bootloader (CPUState *env, uint8_t *base,
} }
static void prom_set(int index, const char *string, ...) static void prom_set(uint32_t* prom_buf, int index, const char *string, ...)
{ {
char buf[ENVP_ENTRY_SIZE];
target_phys_addr_t p;
va_list ap; va_list ap;
int32_t table_addr; int32_t table_addr;
if (index >= ENVP_NB_ENTRIES) if (index >= ENVP_NB_ENTRIES)
return; return;
p = ENVP_ADDR + VIRT_TO_PHYS_ADDEND + index * 4;
if (string == NULL) { if (string == NULL) {
stl_phys(p, 0); prom_buf[index] = 0;
return; return;
} }
table_addr = ENVP_ADDR + sizeof(int32_t) * ENVP_NB_ENTRIES table_addr = sizeof(int32_t) * ENVP_NB_ENTRIES + index * ENVP_ENTRY_SIZE;
+ index * ENVP_ENTRY_SIZE; prom_buf[index] = tswap32(ENVP_ADDR + table_addr);
stl_phys(p, table_addr);
va_start(ap, string); va_start(ap, string);
vsnprintf(buf, ENVP_ENTRY_SIZE, string, ap); vsnprintf((char *)prom_buf + table_addr, ENVP_ENTRY_SIZE, string, ap);
va_end(ap); va_end(ap);
pstrcpy_targphys("prom", table_addr + VIRT_TO_PHYS_ADDEND, ENVP_ENTRY_SIZE, buf);
} }
/* Kernel */ /* Kernel */
static int64_t load_kernel (void) static int64_t load_kernel (void)
{ {
int64_t kernel_entry, kernel_low, kernel_high; int64_t kernel_entry, kernel_low, kernel_high;
int index = 0;
long initrd_size; long initrd_size;
ram_addr_t initrd_offset; ram_addr_t initrd_offset;
int big_endian; int big_endian;
uint32_t *prom_buf;
long prom_size;
int prom_index = 0;
#ifdef TARGET_WORDS_BIGENDIAN #ifdef TARGET_WORDS_BIGENDIAN
big_endian = 1; big_endian = 1;
@ -729,21 +725,27 @@ static int64_t load_kernel (void)
} }
} }
/* Store command line. */ /* Setup prom parameters. */
prom_set(index++, loaderparams.kernel_filename); prom_size = ENVP_NB_ENTRIES * (sizeof(int32_t) + ENVP_ENTRY_SIZE);
if (initrd_size > 0) prom_buf = qemu_malloc(prom_size);
prom_set(index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s",
prom_set(prom_buf, prom_index++, loaderparams.kernel_filename);
if (initrd_size > 0) {
prom_set(prom_buf, prom_index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s",
PHYS_TO_VIRT(initrd_offset), initrd_size, PHYS_TO_VIRT(initrd_offset), initrd_size,
loaderparams.kernel_cmdline); loaderparams.kernel_cmdline);
else } else {
prom_set(index++, loaderparams.kernel_cmdline); prom_set(prom_buf, prom_index++, loaderparams.kernel_cmdline);
}
/* Setup minimum environment variables */ prom_set(prom_buf, prom_index++, "memsize");
prom_set(index++, "memsize"); prom_set(prom_buf, prom_index++, "%i", loaderparams.ram_size);
prom_set(index++, "%i", loaderparams.ram_size); prom_set(prom_buf, prom_index++, "modetty0");
prom_set(index++, "modetty0"); prom_set(prom_buf, prom_index++, "38400n8r");
prom_set(index++, "38400n8r"); prom_set(prom_buf, prom_index++, NULL);
prom_set(index++, NULL);
rom_add_blob_fixed("prom", prom_buf, prom_size,
ENVP_ADDR + VIRT_TO_PHYS_ADDEND);
return kernel_entry; return kernel_entry;
} }