From patchwork Sat Dec 23 03:18:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 10131383 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8B94460318 for ; Sat, 23 Dec 2017 03:19:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A60A29C45 for ; Sat, 23 Dec 2017 03:19:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6BA1229C4B; Sat, 23 Dec 2017 03:19:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0949B29C45 for ; Sat, 23 Dec 2017 03:19:10 +0000 (UTC) Received: from localhost ([::1]:39852 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eSaL7-0002cx-Pq for patchwork-qemu-devel@patchwork.kernel.org; Fri, 22 Dec 2017 22:19:09 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55566) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eSaKS-0002K8-Vi for qemu-devel@nongnu.org; Fri, 22 Dec 2017 22:18:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eSaKS-0001P0-3i for qemu-devel@nongnu.org; Fri, 22 Dec 2017 22:18:28 -0500 Received: from mail-lf0-x244.google.com ([2a00:1450:4010:c07::244]:38394) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eSaKR-0001OG-Rc for qemu-devel@nongnu.org; Fri, 22 Dec 2017 22:18:28 -0500 Received: by mail-lf0-x244.google.com with SMTP id w196so15367096lff.5 for ; Fri, 22 Dec 2017 19:18:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=lOBXmxcxnav8YnFDGeTNg8dFfBtczA+1CwWqowZx8w4=; b=MTvRrXcW1Kr4yXb41wKkGHMTZjF/HOx6/fJGysaO8t44Lfb7oovnueemG/BbjCckVv +iR1uqBNmkHTw3fP/uOTKbqEJNTBpdLlXaqRNV2+1UCX8jO657UYy/fu7i5Y6wpIvihX R9cl7A0GPP9grd++3Sdg4sqStUTkPpjlkI/X2N3vwkcrC+RAgi8F1cnUGICZ+VZ5Uxpl ZztbgAT2SLq/bUcPNXC9Xpbgmo7v8PpaRR4YhpPpEiXtEu4Jks+j6xG7uAtCenEAW6pg bFYUpAe28XQqjn4UhS6LQUW0/sSkoXR9wxd2r/BoonjVu2vK1WPFrIMFe5v2KfMuXK1C aXLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=lOBXmxcxnav8YnFDGeTNg8dFfBtczA+1CwWqowZx8w4=; b=SFxY1nPmoive0wmB1RdP7CVNLv8iqrqBrqx7SC3i4S94U1qq2tR7JCggM09LTk3a2H D21NOh4Hl3KgLm0YatKBGvkEcOVh8wCAPHwfFa+UyataYMvl0gdGFsbNKaHq36D/tQAP wvZAeHJLn1FLOxmfThqrCWkqVnTfPFWyfVhDKufch3FaeydWvZ9uzLRU9tiExMaZiX5y yuaWsLMdkPAYPU1JrCcMtCCr/DSwzeUaxYVJ7hmMnCYgZ4xXjtvaUH6/U7fcCAzUh+zk ETC2uNhc9mSIAUl7QrTHvnGmCJ52MJwcG5XswT2cuCVlxErhIdOZ6pT6W9e+t099Wt5w tIfA== X-Gm-Message-State: AKGB3mJn+LzMLGyti/ZzradKJGlUWU5G+Pvgz8qBx8xLH/uwxMsUyDrW G+ZHJPjevahkEXKtfYtUh5+3iQ== X-Google-Smtp-Source: ACJfBosQ6iA1sdzCzKzfIYMtVxIkjB7kPK/2nb+ZmZEYj2zKBAyKSq4t/DutHfFzBEeMZQ1+wOZyMQ== X-Received: by 10.46.87.77 with SMTP id r13mr9998327ljd.128.1513999105890; Fri, 22 Dec 2017 19:18:25 -0800 (PST) Received: from octofox.net (jcmvbkbc-1-pt.tunnel.tserv24.sto1.ipv6.he.net. [2001:470:27:1fa::2]) by smtp.gmail.com with ESMTPSA id s22sm4556867ljd.42.2017.12.22.19.18.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 22 Dec 2017 19:18:25 -0800 (PST) From: Max Filippov To: qemu-devel@nongnu.org Date: Fri, 22 Dec 2017 19:18:04 -0800 Message-Id: <1513999084-19087-1-git-send-email-jcmvbkbc@gmail.com> X-Mailer: git-send-email 2.1.4 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::244 Subject: [Qemu-devel] [PATCH] hw/xtensa/xtfpga: rewrite mini bootloader X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Max Filippov Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Don't load jump target into the CPU config, instead put it and initial a2 as literals into the mini bootloader and use l32r to load them natively. With these changes it should be possible to do warm reboot of the guest. Signed-off-by: Max Filippov --- hw/xtensa/xtfpga.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c index 1971ecfdc5a3..ba681683d608 100644 --- a/hw/xtensa/xtfpga.c +++ b/hw/xtensa/xtfpga.c @@ -372,15 +372,33 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine) } } if (entry_point != env->pc) { - static const uint8_t jx_a0[] = { + uint8_t boot[] = { #ifdef TARGET_WORDS_BIGENDIAN - 0x0a, 0, 0, + 0x60, 0x00, 0x08, /* j 1f */ + 0x00, /* .literal_position */ + 0x00, 0x00, 0x00, 0x00, /* .literal entry_pc */ + 0x00, 0x00, 0x00, 0x00, /* .literal entry_a2 */ + /* 1: */ + 0x10, 0xff, 0xfe, /* l32r a0, entry_pc */ + 0x12, 0xff, 0xfe, /* l32r a2, entry_a2 */ + 0x0a, 0x00, 0x00, /* jx a0 */ #else - 0xa0, 0, 0, + 0x06, 0x02, 0x00, /* j 1f */ + 0x00, /* .literal_position */ + 0x00, 0x00, 0x00, 0x00, /* .literal entry_pc */ + 0x00, 0x00, 0x00, 0x00, /* .literal entry_a2 */ + /* 1: */ + 0x01, 0xfe, 0xff, /* l32r a0, entry_pc */ + 0x21, 0xfe, 0xff, /* l32r a2, entry_a2 */ + 0xa0, 0x00, 0x00, /* jx a0 */ #endif }; - env->regs[0] = entry_point; - cpu_physical_memory_write(env->pc, jx_a0, sizeof(jx_a0)); + uint32_t entry_pc = tswap32(entry_point); + uint32_t entry_a2 = tswap32(tagptr); + + memcpy(boot + 4, &entry_pc, sizeof(entry_pc)); + memcpy(boot + 8, &entry_a2, sizeof(entry_a2)); + cpu_physical_memory_write(env->pc, boot, sizeof(boot)); } } else { if (flash) {