Revision c938ada2 hw/mips_malta.c
b/hw/mips_malta.c | ||
---|---|---|
655 | 655 |
|
656 | 656 |
} |
657 | 657 |
|
658 |
static void prom_set(int index, const char *string, ...) |
|
658 |
static void prom_set(uint32_t* prom_buf, int index, const char *string, ...)
|
|
659 | 659 |
{ |
660 |
char buf[ENVP_ENTRY_SIZE]; |
|
661 |
target_phys_addr_t p; |
|
662 | 660 |
va_list ap; |
663 | 661 |
int32_t table_addr; |
664 | 662 |
|
665 | 663 |
if (index >= ENVP_NB_ENTRIES) |
666 | 664 |
return; |
667 | 665 |
|
668 |
p = ENVP_ADDR + VIRT_TO_PHYS_ADDEND + index * 4; |
|
669 |
|
|
670 | 666 |
if (string == NULL) { |
671 |
stl_phys(p, 0);
|
|
667 |
prom_buf[index] = 0;
|
|
672 | 668 |
return; |
673 | 669 |
} |
674 | 670 |
|
675 |
table_addr = ENVP_ADDR + sizeof(int32_t) * ENVP_NB_ENTRIES |
|
676 |
+ index * ENVP_ENTRY_SIZE; |
|
677 |
stl_phys(p, table_addr); |
|
671 |
table_addr = sizeof(int32_t) * ENVP_NB_ENTRIES + index * ENVP_ENTRY_SIZE; |
|
672 |
prom_buf[index] = tswap32(ENVP_ADDR + table_addr); |
|
678 | 673 |
|
679 | 674 |
va_start(ap, string); |
680 |
vsnprintf(buf, ENVP_ENTRY_SIZE, string, ap);
|
|
675 |
vsnprintf((char *)prom_buf + table_addr, ENVP_ENTRY_SIZE, string, ap);
|
|
681 | 676 |
va_end(ap); |
682 |
pstrcpy_targphys("prom", table_addr + VIRT_TO_PHYS_ADDEND, ENVP_ENTRY_SIZE, buf); |
|
683 | 677 |
} |
684 | 678 |
|
685 | 679 |
/* Kernel */ |
686 | 680 |
static int64_t load_kernel (void) |
687 | 681 |
{ |
688 | 682 |
int64_t kernel_entry, kernel_low, kernel_high; |
689 |
int index = 0; |
|
690 | 683 |
long initrd_size; |
691 | 684 |
ram_addr_t initrd_offset; |
692 | 685 |
int big_endian; |
686 |
uint32_t *prom_buf; |
|
687 |
long prom_size; |
|
688 |
int prom_index = 0; |
|
693 | 689 |
|
694 | 690 |
#ifdef TARGET_WORDS_BIGENDIAN |
695 | 691 |
big_endian = 1; |
... | ... | |
729 | 725 |
} |
730 | 726 |
} |
731 | 727 |
|
732 |
/* Store command line. */ |
|
733 |
prom_set(index++, loaderparams.kernel_filename); |
|
734 |
if (initrd_size > 0) |
|
735 |
prom_set(index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s", |
|
728 |
/* Setup prom parameters. */ |
|
729 |
prom_size = ENVP_NB_ENTRIES * (sizeof(int32_t) + ENVP_ENTRY_SIZE); |
|
730 |
prom_buf = qemu_malloc(prom_size); |
|
731 |
|
|
732 |
prom_set(prom_buf, prom_index++, loaderparams.kernel_filename); |
|
733 |
if (initrd_size > 0) { |
|
734 |
prom_set(prom_buf, prom_index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s", |
|
736 | 735 |
PHYS_TO_VIRT(initrd_offset), initrd_size, |
737 | 736 |
loaderparams.kernel_cmdline); |
738 |
else |
|
739 |
prom_set(index++, loaderparams.kernel_cmdline); |
|
740 |
|
|
741 |
/* Setup minimum environment variables */ |
|
742 |
prom_set(index++, "memsize"); |
|
743 |
prom_set(index++, "%i", loaderparams.ram_size); |
|
744 |
prom_set(index++, "modetty0"); |
|
745 |
prom_set(index++, "38400n8r"); |
|
746 |
prom_set(index++, NULL); |
|
737 |
} else { |
|
738 |
prom_set(prom_buf, prom_index++, loaderparams.kernel_cmdline); |
|
739 |
} |
|
740 |
|
|
741 |
prom_set(prom_buf, prom_index++, "memsize"); |
|
742 |
prom_set(prom_buf, prom_index++, "%i", loaderparams.ram_size); |
|
743 |
prom_set(prom_buf, prom_index++, "modetty0"); |
|
744 |
prom_set(prom_buf, prom_index++, "38400n8r"); |
|
745 |
prom_set(prom_buf, prom_index++, NULL); |
|
746 |
|
|
747 |
rom_add_blob_fixed("prom", prom_buf, prom_size, |
|
748 |
ENVP_ADDR + VIRT_TO_PHYS_ADDEND); |
|
747 | 749 |
|
748 | 750 |
return kernel_entry; |
749 | 751 |
} |
Also available in: Unified diff