From patchwork Tue Jul 5 10:59:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 587446 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:1ec:0:0:0:0 with SMTP id 12csp1659918map; Tue, 5 Jul 2022 04:24:01 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tA2z94wK+yGgiheXUMtoDJEBrk7o0tKYG8bbYF+RHhZeY3d/6pFNopnxaWLFOecyRM51u8 X-Received: by 2002:a25:8386:0:b0:66e:3dba:b908 with SMTP id t6-20020a258386000000b0066e3dbab908mr13172163ybk.279.1657020241145; Tue, 05 Jul 2022 04:24:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657020241; cv=none; d=google.com; s=arc-20160816; b=UPbd6IeEpSqlV+nUR7EOwEGsq9HI17jfOvZ9ck4xbYE861vGoCMFfPNlADUu6hF1Ls ph2lRXTXVMdToqWq+cV261ZeI5mCLK3ETGEoJ01g/VgzhQPFDAWZ9E1QRzbIMCtwswFK zCyppBaYTd6c1NnJh4rHZSxQ1Kq6zj5edF7qE0k5yGU2Xq5sCNtn7Cb/oyGZ0ZFSBc/3 nSZFsoFyXRjCDPZO5fJ0kCIofHv30nYP2+NC6WwD5S+xVNdv1023hXcMCmSdMU8Hqm80 E1kpYN0SEnIBnqoaTMp2ZduFeTNSWf18rX/u851BgdPxtcyBppzEXXz5WEjs5dbpA1Td 1B7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=l2yErBWzj5ESCHU8EEDRL6D/1bAkAZGvE1eyYa7hP9s=; b=PChXhYeUpFbVPvl3eIVriEx/MWEg5qcR7k/yRemylgsZhOl/wCREaXoKwhPE9fSLj8 vFLw27CPj6LRgI0+vLiCQWJGl42aziZH0BMM2yhbXnRs11AA5/eDAujFiwL5qdRVHAXn TNSC0U2Ox72+WYOt7dHSWSM2Ac237OcB09WfsLFdytoK3+nBvJcs4oR99Lf+21dVg3UJ zeSuX9Mx98UyQsQq33ziMrI2KyTPSGkhxrgI8WBlF6spWBq20OjS/v3tHfBw1QO7qLam KrEwOKdkMMruDSBzVnJKtFrnCIW9puTHFaVCGgbKrb3D7eZ8vjrFF4CDb4fzFwOaZX4N Fvyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=L4pE2MJ4; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 184-20020a8106c1000000b003180d074345si45206726ywg.83.2022.07.05.04.24.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 05 Jul 2022 04:24:01 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=L4pE2MJ4; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:43288 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o8geu-0006up-LC for patch@linaro.org; Tue, 05 Jul 2022 07:24:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40344) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o8gI5-0006wH-Ut for qemu-devel@nongnu.org; Tue, 05 Jul 2022 07:00:26 -0400 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]:53143) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1o8gI0-0000jX-T9 for qemu-devel@nongnu.org; Tue, 05 Jul 2022 07:00:24 -0400 Received: by mail-pj1-x102e.google.com with SMTP id fz10so5705231pjb.2 for ; Tue, 05 Jul 2022 04:00:20 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=l2yErBWzj5ESCHU8EEDRL6D/1bAkAZGvE1eyYa7hP9s=; b=L4pE2MJ4f1tjX8pmM0ptFwGkw2raZ3UFH2QlkNjOhkv1wPRYa2iQgochHgiOgaJKlQ Gsc0iPkLL5vRO9vGOffuWpYOzAv6meBujVNhsP7Dxy6aUD4jM5bTVc4O6RcQxhIfo7rw mc6T7dkZ0TsGsXeDMgSZ6Krh1AurPHH6SbyL2Lkw938P+qMCSZZBMnu/HKp/xHzdErVM pyXTRLtJdn5PKa+kVZwAehYvaVpYalh39BXqgJNyQtBVBoTD5fvrI25Cl1os2ZTFlLRr mIGCtlLi6brqjp8zPmY8DzplupPN5XWCoaueBMzUZ/PiRsl+nOri6W574JBuRyTIUhoF Agaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=l2yErBWzj5ESCHU8EEDRL6D/1bAkAZGvE1eyYa7hP9s=; b=xUpkeWjpGjopkkgmWDmofbmlMlPB4z26M5LQTwNKlR8UvqxxitjC7RZlZUkGZneLes 9ysTudOQOBBJe+uSTFrRlwauzdRTvgju2fWacEn7KQ2fhDdXOMZr8qRRRR+pk/J2n9uD oB6T65i01Uw3Pm9pH32tK5aCWPYl+pQ8jUEa8ERTbl1Ec1arNMlbm7z/z9Z3J5BSi7VQ E+DSFnVd3pyfQWS1HT0MFuWrNg1E/HbBW09Lxx/Y+HvRvv8kWLNRP22iQDTc1V7Y7JTJ ihuwPogZ89a46efR5OW7TgWnw0DpwNgPo+3tyNYe0i2HTbVMaIFF2LHQd3daxn7IJHKS 4OXQ== X-Gm-Message-State: AJIora9rxFSpv465VTDvYM4SP3HHRea7wADcXzeKVcmP7QcbXihVyxYm NVdtUeKDVhLvJWNSqalxApfi03PqfxtYCpul X-Received: by 2002:a17:903:2614:b0:16b:d519:d1e2 with SMTP id jd20-20020a170903261400b0016bd519d1e2mr16800847plb.93.1657018819671; Tue, 05 Jul 2022 04:00:19 -0700 (PDT) Received: from stoup.. ([122.255.60.245]) by smtp.gmail.com with ESMTPSA id d18-20020a170903231200b0016bf7981d0bsm508454plh.86.2022.07.05.04.00.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Jul 2022 04:00:19 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Xiaojuan Yang Subject: [PULL 6/6] hw/intc/loongarch_ipi: Fix mail send and any send function Date: Tue, 5 Jul 2022 16:29:57 +0530 Message-Id: <20220705105957.1144514-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220705105957.1144514-1-richard.henderson@linaro.org> References: <20220705105957.1144514-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::102e; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x102e.google.com 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Xiaojuan Yang By the document of ipi mailsend device, byte is written only when the mask bit is 0. The original code discards mask bit and overwrite the data always, this patch fixes the issue. Signed-off-by: Xiaojuan Yang Message-Id: <20220705064901.2353349-3-yangxiaojuan@loongson.cn> Signed-off-by: Richard Henderson --- hw/intc/loongarch_ipi.c | 54 +++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/hw/intc/loongarch_ipi.c b/hw/intc/loongarch_ipi.c index b8b1b9cd53..4f3c58f872 100644 --- a/hw/intc/loongarch_ipi.c +++ b/hw/intc/loongarch_ipi.c @@ -50,35 +50,45 @@ static uint64_t loongarch_ipi_readl(void *opaque, hwaddr addr, unsigned size) return ret; } -static int get_ipi_data(target_ulong val) +static void send_ipi_data(CPULoongArchState *env, target_ulong val, target_ulong addr) { - int i, mask, data; + int i, mask = 0, data = 0; - data = val >> 32; - mask = (val >> 27) & 0xf; - - for (i = 0; i < 4; i++) { - if ((mask >> i) & 1) { - data &= ~(0xff << (i * 8)); + /* + * bit 27-30 is mask for byte writing, + * if the mask is 0, we need not to do anything. + */ + if ((val >> 27) & 0xf) { + data = address_space_ldl(&env->address_space_iocsr, addr, + MEMTXATTRS_UNSPECIFIED, NULL); + for (i = 0; i < 4; i++) { + /* get mask for byte writing */ + if (val & (0x1 << (27 + i))) { + mask |= 0xff << (i * 8); + } } } - return data; + + data &= mask; + data |= (val >> 32) & ~mask; + address_space_stl(&env->address_space_iocsr, addr, + data, MEMTXATTRS_UNSPECIFIED, NULL); } static void ipi_send(uint64_t val) { int cpuid, data; CPULoongArchState *env; + CPUState *cs; + LoongArchCPU *cpu; cpuid = (val >> 16) & 0x3ff; /* IPI status vector */ data = 1 << (val & 0x1f); - qemu_mutex_lock_iothread(); - CPUState *cs = qemu_get_cpu(cpuid); - LoongArchCPU *cpu = LOONGARCH_CPU(cs); + cs = qemu_get_cpu(cpuid); + cpu = LOONGARCH_CPU(cs); env = &cpu->env; loongarch_cpu_set_irq(cpu, IRQ_IPI, 1); - qemu_mutex_unlock_iothread(); address_space_stl(&env->address_space_iocsr, 0x1008, data, MEMTXATTRS_UNSPECIFIED, NULL); @@ -86,23 +96,23 @@ static void ipi_send(uint64_t val) static void mail_send(uint64_t val) { - int cpuid, data; + int cpuid; hwaddr addr; CPULoongArchState *env; + CPUState *cs; + LoongArchCPU *cpu; cpuid = (val >> 16) & 0x3ff; addr = 0x1020 + (val & 0x1c); - CPUState *cs = qemu_get_cpu(cpuid); - LoongArchCPU *cpu = LOONGARCH_CPU(cs); + cs = qemu_get_cpu(cpuid); + cpu = LOONGARCH_CPU(cs); env = &cpu->env; - data = get_ipi_data(val); - address_space_stl(&env->address_space_iocsr, addr, - data, MEMTXATTRS_UNSPECIFIED, NULL); + send_ipi_data(env, val, addr); } static void any_send(uint64_t val) { - int cpuid, data; + int cpuid; hwaddr addr; CPULoongArchState *env; @@ -111,9 +121,7 @@ static void any_send(uint64_t val) CPUState *cs = qemu_get_cpu(cpuid); LoongArchCPU *cpu = LOONGARCH_CPU(cs); env = &cpu->env; - data = get_ipi_data(val); - address_space_stl(&env->address_space_iocsr, addr, - data, MEMTXATTRS_UNSPECIFIED, NULL); + send_ipi_data(env, val, addr); } static void loongarch_ipi_writel(void *opaque, hwaddr addr, uint64_t val,