From patchwork Wed Sep 16 02:12:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: chen huacai X-Patchwork-Id: 11778695 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D0E7E59D for ; Wed, 16 Sep 2020 02:14:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6658F206C9 for ; Wed, 16 Sep 2020 02:14:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HKKSg0v6" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6658F206C9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43228 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kIMxp-0005qw-9x for patchwork-qemu-devel@patchwork.kernel.org; Tue, 15 Sep 2020 22:14:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45336) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kIMwm-0004mu-HG for qemu-devel@nongnu.org; Tue, 15 Sep 2020 22:13:24 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:46950) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kIMwk-0003gr-RX for qemu-devel@nongnu.org; Tue, 15 Sep 2020 22:13:24 -0400 Received: by mail-pf1-x443.google.com with SMTP id b124so3019609pfg.13 for ; Tue, 15 Sep 2020 19:13:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NT2NaTDoFyX6YtFvcEFgk7zVNbXeaFgR6IheAsEIBBE=; b=HKKSg0v6IHa7J+UAhNkHu2eS2YE8L35XM3DgDR7E7feXVjv/IZsYMzWHtX/E+5a0OK uuFTrXiWop1D+WcfiZjMkjRdzzzjE8wCpUUZYmg9BHVFfPewokZqwBqUksMY2JojE12p fCwYc4aZDvuKPTS50YkroH78+OpHH8KQzmlli/bJM3GcgEC1XdwHb8lH45DXeR80glku uKg+gMGtgrC6eRqWK4rU9jODUAvjOJYCOYVJqIQFjMWsywWPYpy0gC9BmXR2Zi2YIkkj mVIhF3xTBRopZ295+uYBUU4RzIot9RUQ2znBKcpdFwE1BNoMxB+rfrbsZ4xPmbkFYLL7 tBjA== 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=NT2NaTDoFyX6YtFvcEFgk7zVNbXeaFgR6IheAsEIBBE=; b=JWYR+w5ejhI/ty7vUA8HBLSfYUPW70LAoRC+QpgRqhWQzWLbeoC6lh/HlUvf6h+bJM f9y6Cr1WTCqIE5HF44++ZJLFgNXLilXdvBolhaW3QWRM2dKrHSh9f7Fz3ubkQZfapApj SBsgm/w8vm4I+171EEccmCZ4WJAYrmSchsMj9Pl3GnQ1uD9KX1/1xMyY1HxfxM9b8a6A OVmuMj349cJ+TFRbniFFHaKLZtUH/iwPZMkfV7gOCh7Eh0sWVrhkbbKwrNKLlJqwwYGZ Ms8XnAioxrktz5zck4DsTjnvfSxGyKn09NKXKCwTN0n/6Ovk7SR7vYeXNB4eOtip+Zd9 Ya6A== X-Gm-Message-State: AOAM531OLoxXG11cnHqKEx1/ZdXkCAQVIkyLcK7lwuU+thvvtwvyvnfL W9KgbXRjfSNqDmgLWd74yiY= X-Google-Smtp-Source: ABdhPJw2wr7LWil3xM6GEnEtO6D3ivQ2r215dXuVY17FpJUQeNcZF7wpELlrKUKMR9PjP0AzXCrqKw== X-Received: by 2002:a63:354:: with SMTP id 81mr17419322pgd.216.1600222400022; Tue, 15 Sep 2020 19:13:20 -0700 (PDT) Received: from software.domain.org ([45.77.13.216]) by smtp.gmail.com with ESMTPSA id y29sm16149486pfq.207.2020.09.15.19.13.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Sep 2020 19:13:19 -0700 (PDT) From: Huacai Chen X-Google-Original-From: Huacai Chen To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aleksandar Markovic Subject: [PATCH V9 2/6] target/mips: Fix PageMask with variable page size Date: Wed, 16 Sep 2020 10:12:20 +0800 Message-Id: <1600222344-16808-3-git-send-email-chenhc@lemote.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1600222344-16808-1-git-send-email-chenhc@lemote.com> References: <1600222344-16808-1-git-send-email-chenhc@lemote.com> Received-SPF: pass client-ip=2607:f8b0:4864:20::443; envelope-from=zltjiangshi@gmail.com; helo=mail-pf1-x443.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Aleksandar Rikalo , Huacai Chen , qemu-devel@nongnu.org, Jiaxun Yang , Huacai Chen , Aurelien Jarno Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Jiaxun Yang Our current code assumed the target page size is always 4k when handling PageMask and VPN2, however, variable page size was just added to mips target and that's nolonger true. Signed-off-by: Huacai Chen Signed-off-by: Jiaxun Yang --- target/mips/cp0_helper.c | 36 +++++++++++++++++++++++++++++------- target/mips/cpu.h | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/target/mips/cp0_helper.c b/target/mips/cp0_helper.c index de64add..62bcb97 100644 --- a/target/mips/cp0_helper.c +++ b/target/mips/cp0_helper.c @@ -867,13 +867,35 @@ void helper_mtc0_memorymapid(CPUMIPSState *env, target_ulong arg1) void update_pagemask(CPUMIPSState *env, target_ulong arg1, int32_t *pagemask) { - uint64_t mask = arg1 >> (TARGET_PAGE_BITS + 1); - if (!(env->insn_flags & ISA_MIPS32R6) || (arg1 == ~0) || - (mask == 0x0000 || mask == 0x0003 || mask == 0x000F || - mask == 0x003F || mask == 0x00FF || mask == 0x03FF || - mask == 0x0FFF || mask == 0x3FFF || mask == 0xFFFF)) { - env->CP0_PageMask = arg1 & (0x1FFFFFFF & (TARGET_PAGE_MASK << 1)); + unsigned long mask; + int maskbits; + + if (env->insn_flags & ISA_MIPS32R6) { + return; + } + /* Don't care MASKX as we don't support 1KB page */ + mask = extract32((uint32_t)arg1, CP0PM_MASK, 16); + maskbits = find_first_zero_bit(&mask, 32); + + /* Ensure no more set bit after first zero */ + if (mask >> maskbits) { + goto invalid; + } + /* We don't support VTLB entry smaller than target page */ + if ((maskbits + 12) < TARGET_PAGE_BITS) { + goto invalid; } + env->CP0_PageMask = mask << CP0PM_MASK; + + return; + +invalid: + /* + * When invalid, ensure the value is bigger tan or equel to + * the minimal but smaller than or equel to the maxium. + */ + maskbits = MIN(16, MAX(maskbits, TARGET_PAGE_BITS - 12)); + env->CP0_PageMask = ((1 << (16 + 1)) - 1) << CP0PM_MASK; } void helper_mtc0_pagemask(CPUMIPSState *env, target_ulong arg1) @@ -1104,7 +1126,7 @@ void helper_mthc0_saar(CPUMIPSState *env, target_ulong arg1) void helper_mtc0_entryhi(CPUMIPSState *env, target_ulong arg1) { target_ulong old, val, mask; - mask = (TARGET_PAGE_MASK << 1) | env->CP0_EntryHi_ASID_mask; + mask = ~((1 << 14) - 1) | env->CP0_EntryHi_ASID_mask; if (((env->CP0_Config4 >> CP0C4_IE) & 0x3) >= 2) { mask |= 1 << CP0EnHi_EHINV; } diff --git a/target/mips/cpu.h b/target/mips/cpu.h index 7cf7f52..9c8bb23 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -618,6 +618,7 @@ struct CPUMIPSState { * CP0 Register 5 */ int32_t CP0_PageMask; +#define CP0PM_MASK 13 int32_t CP0_PageGrain_rw_bitmask; int32_t CP0_PageGrain; #define CP0PG_RIE 31