[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading
From: |
Max Filippov |
Subject: |
[Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading |
Date: |
Mon, 23 Jun 2014 20:12:54 +0400 |
Provide a simple bootloader code at the reset address that jumps to the
loaded image entry point when it's not equal to the reset address. This
is needed because the old method of setting pc doesn't work due to cpu
reset done after the machine setup.
Signed-off-by: Max Filippov <address@hidden>
---
hw/xtensa/xtfpga.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 97e5842..0e0d825 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -237,6 +237,7 @@ static void lx_init(const LxBoardDesc *board, MachineState
*machine)
/* Use presence of kernel file name as 'boot from SRAM' switch. */
if (kernel_filename) {
+ uint32_t entry_point = env->pc;
size_t bp_size = 3 * get_tag_size(0); /* first/last and memory tags */
uint32_t tagptr = 0xfe000000 + board->sram_size;
uint32_t cur_tagptr;
@@ -273,7 +274,29 @@ static void lx_init(const LxBoardDesc *board, MachineState
*machine)
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
&elf_entry, &elf_lowaddr, NULL, be, ELF_MACHINE, 0);
if (success > 0) {
- env->pc = elf_entry;
+ entry_point = elf_entry;
+ } else {
+ hwaddr ep;
+ int is_linux;
+ success = load_uimage(kernel_filename, &ep, NULL, &is_linux);
+ if (success > 0 && is_linux) {
+ entry_point = ep;
+ } else {
+ error_report("could not load kernel '%s'\n",
+ kernel_filename);
+ exit(EXIT_FAILURE);
+ }
+ }
+ if (entry_point != env->pc) {
+ static const uint8_t jx_a0[] = {
+#ifdef TARGET_WORDS_BIGENDIAN
+ 0x0a, 0, 0,
+#else
+ 0xa0, 0, 0,
+#endif
+ };
+ env->regs[0] = entry_point;
+ cpu_physical_memory_write(env->pc, jx_a0, sizeof(jx_a0));
}
} else {
if (flash) {
--
1.8.1.4
- [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 1/9] hw/xtensa: remove extraneous xtensa_ prefix from file names, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 5/9] hw/xtensa/xtfpga: refactor bootparameters filling, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 2/9] hw/xtensa: replace fprintfs with error_report, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 3/9] hw/xtensa/xtfpga: retrieve parameters from machine_opts, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 4/9] hw/xtensa/xtfpga: use symbolic constants for bootparam tags, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading,
Max Filippov <=
- [Qemu-devel] [PATCH 8/9] hw/xtensa/xtfpga: implement DTB loading, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 6/9] hw/xtensa/xtfpga: add memory info to bootparam, Max Filippov, 2014/06/23
- [Qemu-devel] [PATCH 9/9] hw/xtensa/xtfpga: implement initrd loading, Max Filippov, 2014/06/23