From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43765) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz6sM-00033N-Cg for qemu-devel@nongnu.org; Mon, 23 Jun 2014 12:13:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wz6sD-0001lv-1O for qemu-devel@nongnu.org; Mon, 23 Jun 2014 12:13:46 -0400 Received: from mail-lb0-x22a.google.com ([2a00:1450:4010:c04::22a]:45816) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz6sC-0001lh-Pa for qemu-devel@nongnu.org; Mon, 23 Jun 2014 12:13:36 -0400 Received: by mail-lb0-f170.google.com with SMTP id 10so4947510lbg.29 for ; Mon, 23 Jun 2014 09:13:35 -0700 (PDT) From: Max Filippov Date: Mon, 23 Jun 2014 20:12:54 +0400 Message-Id: <1403539976-22581-8-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1403539976-22581-1-git-send-email-jcmvbkbc@gmail.com> References: <1403539976-22581-1-git-send-email-jcmvbkbc@gmail.com> Subject: [Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Max Filippov , Waldemar Brodkorb 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 --- 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