From patchwork Mon Jan 22 03:42:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 125314 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp949208ljf; Sun, 21 Jan 2018 20:04:06 -0800 (PST) X-Google-Smtp-Source: AH8x227ghc2SfOzgp+gUsyYhocHdSSF4HwMleKBpJAnX2fvZ5ZIjZG7zNNISFo4oW6RuX6uhf5O6 X-Received: by 10.37.181.130 with SMTP id q2mr6029521ybj.429.1516593846550; Sun, 21 Jan 2018 20:04:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516593846; cv=none; d=google.com; s=arc-20160816; b=vM9zvssHMDtOYzFxaE8Y+L0GlJfaMC6JaqV6Z069BhdXfZq1JkvK0UNXZsxpZhm7d+ I5sOKfMcT6DTbW+0tcpV9QQUpGRR+4Hj3wOkL8915Ze8Y4E/Mycdb0A5OrBrr1KyOjH8 darfctHsZ+CiXeyvMK5lry1Rrq1lD9vV8U+1lgKe4YOCToxZBEVlBuPMoNRkLPUfk2zX SYHd14J+LfjQ73Nnuw4brQPO7gAR/PYdG0erwPmK1fsOvPlVC6l/riNqrnRSux2JOWID zRd/vmDx+3ZN9vgYTdb7mjF0veyNE8O0ayzUboGx4SRi77X3pc0PE5rGE7rbS3/N/w9k XlWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature:arc-authentication-results; bh=MaG9Rwopn83QHEKkMTmfjC0sA1jP9/xTUxqjxCfG5XM=; b=Nzz+BiYWnFCEvBmwZeNs7OElkJwLxbNkAHyZdiNfikIelSUVoM+SQ58i62J7laaCBq +5vILU2I1XbFaQenHs95QLZXyl/LxuYe2SpToMQS8gGD8McrMJM/T40ii1HDWwLz/08q 5eF/aq7Q8+N5wyrdInyxULWVxMghNuUxYWg32GvVBRq/2iqiGmJEOhIkpYVU4sHrq20S VRfwTiFuJNavEq91KCHivtq9vRk1fqYTQI06VKvs78k4ZbN6ThhlyCG+n9ulrLBeApP1 dVhn1QO7S3ddiFEKvQwddNIA7y8mhytSUePXJ7zFHsPxKaFc3V/0ni+3JaHaOB2x0S3a 2ObQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fruBa7Mm; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id n6si1792534ybc.461.2018.01.21.20.04.06 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 21 Jan 2018 20:04:06 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fruBa7Mm; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:41748 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1edTL3-0003nX-Sv for patch@linaro.org; Sun, 21 Jan 2018 23:04:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60344) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1edT0f-0005mD-1i for qemu-devel@nongnu.org; Sun, 21 Jan 2018 22:43:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1edT0e-0006eL-1X for qemu-devel@nongnu.org; Sun, 21 Jan 2018 22:43:01 -0500 Received: from mail-pg0-x244.google.com ([2607:f8b0:400e:c05::244]:33970) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1edT0d-0006e3-RG for qemu-devel@nongnu.org; Sun, 21 Jan 2018 22:42:59 -0500 Received: by mail-pg0-x244.google.com with SMTP id r19so6095968pgn.1 for ; Sun, 21 Jan 2018 19:42:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MaG9Rwopn83QHEKkMTmfjC0sA1jP9/xTUxqjxCfG5XM=; b=fruBa7MmSYegkMtTFJyDvHOz5wBqSBFBAtfYRYq7KK34KlGB7jDVwHmVr0QK4nFhdt CnrVsB/GTyRxV4AQH3hxMvzZN5nuBjl909mYuLHpu+4fs+cyRFRgghViTb9/XQXcbXsA 3t7eY/jE9vkaDaUjkWiimXo+JiCB8v2dhR4Tk= 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:in-reply-to :references; bh=MaG9Rwopn83QHEKkMTmfjC0sA1jP9/xTUxqjxCfG5XM=; b=kdWnq4boHFfr1Sy17+fpE0N7kAQJ/ChyRMKalEqiZTeKnusfKLyIDph1hkJFCCkYnr bbMcrlN2wiP+sYqnOKG6M9hSaQm0uahPRwpTYOUsApw9+K9QQSR7kPtVTO2zLYgsSt03 PJXWvLOE2zEU+7rnvwjR/KjLhlmqa9D5fAC6u2tySbtzmCjAko2ymsxKA0DyF/0YGbhL uXhFoDEcXnjRCdh/6uKist1RikBOGl77fLV4gntdw7HunAXUA2hiBCjgciT6OqrAGBnB +U9AXLhk3SdosQh/bvoi09mPEYAaH1l0AfIGI03qaiK0lBpsa+WByPwpj9bQR/YMlIbw QRPA== X-Gm-Message-State: AKwxytdp8aP30u4K9Dq/RL/FyEOEVcjsXjTWW+gWnZ5PgpG17HpeorYp AXqnBxTkLg+ftVNrh3wPBAHgrwNNPao= X-Received: by 10.98.18.150 with SMTP id 22mr7095669pfs.180.1516592578555; Sun, 21 Jan 2018 19:42:58 -0800 (PST) Received: from cloudburst.twiddle.net (174-21-6-47.tukw.qwest.net. [174.21.6.47]) by smtp.gmail.com with ESMTPSA id z125sm182023pfz.27.2018.01.21.19.42.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 21 Jan 2018 19:42:57 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 21 Jan 2018 19:42:01 -0800 Message-Id: <20180122034217.19593-28-richard.henderson@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180122034217.19593-1-richard.henderson@linaro.org> References: <20180122034217.19593-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::244 Subject: [Qemu-devel] [PULL 27/43] target/hppa: Implement halt and reset instructions 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: peter.maydell@linaro.org, Helge Deller Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Helge Deller Real hardware would use an external device to control the power. But for the moment let's invent instructions in reserved space, to be used by our custom firmware. Signed-off-by: Helge Deller Signed-off-by: Richard Henderson --- target/hppa/helper.h | 2 ++ target/hppa/op_helper.c | 13 +++++++++++++ target/hppa/translate.c | 25 ++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) -- 2.14.3 diff --git a/target/hppa/helper.h b/target/hppa/helper.h index 1e733b7926..31320740da 100644 --- a/target/hppa/helper.h +++ b/target/hppa/helper.h @@ -80,6 +80,8 @@ DEF_HELPER_FLAGS_4(fmpynfadd_d, TCG_CALL_NO_RWG, i64, env, i64, i64, i64) DEF_HELPER_FLAGS_0(read_interval_timer, TCG_CALL_NO_RWG, tr) #ifndef CONFIG_USER_ONLY +DEF_HELPER_1(shutdown, noreturn, env) +DEF_HELPER_1(reset, noreturn, env) DEF_HELPER_1(rfi, void, env) DEF_HELPER_1(rfi_r, void, env) DEF_HELPER_FLAGS_2(write_interval_timer, TCG_CALL_NO_RWG, void, env, tr) diff --git a/target/hppa/op_helper.c b/target/hppa/op_helper.c index d270f94e31..c2eeced0e9 100644 --- a/target/hppa/op_helper.c +++ b/target/hppa/op_helper.c @@ -22,6 +22,7 @@ #include "exec/exec-all.h" #include "exec/helper-proto.h" #include "exec/cpu_ldst.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" @@ -639,6 +640,18 @@ void HELPER(write_interval_timer)(CPUHPPAState *env, target_ureg val) timer_mod(cpu->alarm_timer, timeout); } +void HELPER(shutdown)(CPUHPPAState *env) +{ + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); + helper_excp(env, EXCP_HLT); +} + +void HELPER(reset)(CPUHPPAState *env) +{ + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + helper_excp(env, EXCP_HLT); +} + target_ureg HELPER(swap_system_mask)(CPUHPPAState *env, target_ureg nsm) { target_ulong psw = env->psw; diff --git a/target/hppa/translate.c b/target/hppa/translate.c index a311a464bf..de96765664 100644 --- a/target/hppa/translate.c +++ b/target/hppa/translate.c @@ -2291,6 +2291,18 @@ static DisasJumpType trans_rfi(DisasContext *ctx, uint32_t insn, /* Exit the TB to recognize new interrupts. */ return nullify_end(ctx, DISAS_NORETURN); } + +static DisasJumpType gen_hlt(DisasContext *ctx, int reset) +{ + CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR); + nullify_over(ctx); + if (reset) { + gen_helper_reset(cpu_env); + } else { + gen_helper_shutdown(cpu_env); + } + return nullify_end(ctx, DISAS_NORETURN); +} #endif /* !CONFIG_USER_ONLY */ static const DisasInsn table_system[] = { @@ -4508,7 +4520,18 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x15: /* unassigned */ case 0x1D: /* unassigned */ case 0x37: /* unassigned */ - case 0x3F: /* unassigned */ + break; + case 0x3F: +#ifndef CONFIG_USER_ONLY + /* Unassigned, but use as system-halt. */ + if (insn == 0xfffdead0) { + return gen_hlt(ctx, 0); /* halt system */ + } + if (insn == 0xfffdead1) { + return gen_hlt(ctx, 1); /* reset system */ + } +#endif + break; default: break; }