From patchwork Mon Aug 12 14:13:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 13760665 Received: from out-181.mta1.migadu.com (out-181.mta1.migadu.com [95.215.58.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBC6717E47A for ; Mon, 12 Aug 2024 14:14:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472048; cv=none; b=quA6AEgarISkpCrOQfzN/NnjEl8KMPOHS851Is71USfOCN5Ei2i3iPbPMjYXBA3X58kfxLMmwCODaB/83r9eKHM/EpV4HgHMGrET1YVgSjeMGnqMPRK/ThIYKjSlvtlWB+ig7zgGrprIFSX1QvfLVHG3ocd5bQGgCYitnuODHZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472048; c=relaxed/simple; bh=Tly0u8fLrFMPiyltX8Q0BL6IV/kyYFKfA6dCoyLMmic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sdDk08SCmCEHLYQepqQMfZsAn3BhEa3cClBqh2p5itxZeZzF+HLrfJDD+pGDbwbHOUFECpncAa7zkVhIjLVgKfK4jUmYVvew7qtAg/ytig6CfmwG7+SEZlrngRKqU2Tez+zVBbHro/j5x8bXUJ9vY7yuNpJXttlwTEPipgW8xeo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=p8uP2XhY; arc=none smtp.client-ip=95.215.58.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="p8uP2XhY" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1723472044; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+iYX6kGglESM6CdwC18ttg651AtfAE9zmr/i9M+sIAk=; b=p8uP2XhYmr+8yOUvIajF9qHHC1XuadpXSoTvbqQR4rXIQXIteUeKclgbN/zQdR1H3dbd1k J64WM+xgmlC2Psy6LLJoAEy1onGq+YfKVGPdlMnQPug5fFrEEV2hVvL/vSffO0r6+W7HP9 9Ip4juu9m2eP1n15YIeStTQGB7gqFWc= From: Andrew Jones To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org Cc: atishp@rivosinc.com, cade.richard@berkeley.edu, jamestiotio@gmail.com Subject: [kvm-unit-tests PATCH 1/4] riscv: sbi: dbcn: Output return values Date: Mon, 12 Aug 2024 16:13:56 +0200 Message-ID: <20240812141354.119889-7-andrew.jones@linux.dev> In-Reply-To: <20240812141354.119889-6-andrew.jones@linux.dev> References: <20240812141354.119889-6-andrew.jones@linux.dev> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT When a test fails its nice to be able to see exactly what error code it failed with in order to immediately start debug. Signed-off-by: Andrew Jones --- riscv/sbi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/riscv/sbi.c b/riscv/sbi.c index 93a79d8095f5..2393929b965d 100644 --- a/riscv/sbi.c +++ b/riscv/sbi.c @@ -299,7 +299,7 @@ static void check_dbcn(void) num_calls++; } while (num_bytes != 0 && ret.error == SBI_SUCCESS); - report(ret.error == SBI_SUCCESS, "write success"); + report(ret.error == SBI_SUCCESS, "write success (error=%ld)", ret.error); report_info("%d sbi calls made", num_calls); /* Bytes are read from memory and written to the console */ @@ -307,7 +307,7 @@ static void check_dbcn(void) paddr = strtoull(getenv("INVALID_ADDR"), NULL, 0); split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, 1, base_addr_lo, base_addr_hi); - report(ret.error == SBI_ERR_INVALID_PARAM, "invalid parameter: address"); + report(ret.error == SBI_ERR_INVALID_PARAM, "invalid parameter: address (error=%ld)", ret.error); } report_prefix_pop(); @@ -317,8 +317,8 @@ static void check_dbcn(void) puts("DBCN_WRITE TEST CHAR: "); ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, (u8)DBCN_WRITE_BYTE_TEST_BYTE, 0, 0); puts("\n"); - report(ret.error == SBI_SUCCESS, "write success"); - report(ret.value == 0, "expected ret.value"); + report(ret.error == SBI_SUCCESS, "write success (error=%ld)", ret.error); + report(ret.value == 0, "expected ret.value (%ld)", ret.value); report_prefix_pop(); } From patchwork Mon Aug 12 14:13:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 13760666 Received: from out-182.mta1.migadu.com (out-182.mta1.migadu.com [95.215.58.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A04B17F4E5 for ; Mon, 12 Aug 2024 14:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472052; cv=none; b=qHVKq+lb2SC6nYYbvN54zLrG8bvxFeES7jAhdWB7/GLJIxnVkN8rac0WfN0EIB/FvP3asyeeUi4zJiaXxLHKocI/X0XzLCp8VmultI2KSgRI43G1RPbuWPnqbGxsmQAR9FERWXTq8mehnO6Gfw/XM1FY1FmnVwrf4ULy/lN8FOo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472052; c=relaxed/simple; bh=mR2Z+T8XDqIIMQJEhX/2Bh4rBS3/xgaDDDrcxlV06OU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CXbDpsn2ebwPiXu+vu+ChX8a1qbbP5bxus6dyLe0Rfodt1vAe+jHjG2d9UnBjeau1wzj2A2r+P16bHhSCEIwQCY1Nw+o6oMeBFVJUrnXsHQYzGIg7nCF/IJ8N5XmONXr+cLI2LckF0Lm8gemV9no6uPvzAQl9CcniJ2xbbyyrz8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=WcKdXkOp; arc=none smtp.client-ip=95.215.58.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="WcKdXkOp" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1723472046; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A9b7yuIV81EFMV6IdsZHbE23iNNqeOt+Yr7GlpQoJ2U=; b=WcKdXkOpLXJkYKNd+uzWDJsFq+cUddbvk+aFcGe4SaqVzs4wV72WyCKQ3FY7StzdnZFep9 6ZUTblKd/Q0roIDQZ020HvVhLtOdWJyZx1VRMWwEg5ArEbiphCZRqV1MuTrQcqYHqbEG53 JqZXt8ZLKOMQ7XRAFeY79fYnJQ2CSmc= From: Andrew Jones To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org Cc: atishp@rivosinc.com, cade.richard@berkeley.edu, jamestiotio@gmail.com Subject: [kvm-unit-tests PATCH 2/4] riscv: sbi: Use strtoul to avoid overflow Date: Mon, 12 Aug 2024 16:13:57 +0200 Message-ID: <20240812141354.119889-8-andrew.jones@linux.dev> In-Reply-To: <20240812141354.119889-6-andrew.jones@linux.dev> References: <20240812141354.119889-6-andrew.jones@linux.dev> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT We want to compare the expected values provided by environment variables with signed long results, but we should parse those values as unsigned as they may actually represent unsigned numbers with the MSB set, and, if that's the case, then strtol will assert when detecting the signed value overflow. Signed-off-by: Andrew Jones --- riscv/sbi.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/riscv/sbi.c b/riscv/sbi.c index 2393929b965d..7b63a97deda6 100644 --- a/riscv/sbi.c +++ b/riscv/sbi.c @@ -85,14 +85,14 @@ static void check_base(void) report_prefix_push("spec_version"); if (env_or_skip("SPEC_VERSION")) { - expected = strtol(getenv("SPEC_VERSION"), NULL, 0); + expected = (long)strtoul(getenv("SPEC_VERSION"), NULL, 0); gen_report(&ret, 0, expected); } report_prefix_pop(); report_prefix_push("impl_id"); if (env_or_skip("IMPL_ID")) { - expected = strtol(getenv("IMPL_ID"), NULL, 0); + expected = (long)strtoul(getenv("IMPL_ID"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_IMP_ID, 0); gen_report(&ret, 0, expected); } @@ -100,14 +100,14 @@ static void check_base(void) report_prefix_push("impl_version"); if (env_or_skip("IMPL_VERSION")) { - expected = strtol(getenv("IMPL_VERSION"), NULL, 0); + expected = (long)strtoul(getenv("IMPL_VERSION"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_IMP_VERSION, 0); gen_report(&ret, 0, expected); } report_prefix_pop(); report_prefix_push("probe_ext"); - expected = getenv("PROBE_EXT") ? strtol(getenv("PROBE_EXT"), NULL, 0) : 1; + expected = getenv("PROBE_EXT") ? (long)strtoul(getenv("PROBE_EXT"), NULL, 0) : 1; ret = __base_sbi_ecall(SBI_EXT_BASE_PROBE_EXT, SBI_EXT_BASE); gen_report(&ret, 0, expected); report_prefix_push("unavailable"); @@ -118,7 +118,8 @@ static void check_base(void) report_prefix_push("mvendorid"); if (env_or_skip("MVENDORID")) { - expected = strtol(getenv("MVENDORID"), NULL, 0); + expected = (long)strtoul(getenv("MVENDORID"), NULL, 0); + assert(__riscv_xlen == 32 || !(expected >> 32)); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_MVENDORID, 0); gen_report(&ret, 0, expected); } @@ -126,7 +127,7 @@ static void check_base(void) report_prefix_push("marchid"); if (env_or_skip("MARCHID")) { - expected = strtol(getenv("MARCHID"), NULL, 0); + expected = (long)strtoul(getenv("MARCHID"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_MARCHID, 0); gen_report(&ret, 0, expected); } @@ -134,7 +135,7 @@ static void check_base(void) report_prefix_push("mimpid"); if (env_or_skip("MIMPID")) { - expected = strtol(getenv("MIMPID"), NULL, 0); + expected = (long)strtoul(getenv("MIMPID"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_MIMPID, 0); gen_report(&ret, 0, expected); } From patchwork Mon Aug 12 14:13:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 13760667 Received: from out-188.mta1.migadu.com (out-188.mta1.migadu.com [95.215.58.188]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 079A217E47A for ; Mon, 12 Aug 2024 14:14:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.188 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472053; cv=none; b=QR0Q2g/GNu9xZ1Et9oooA6Ma8DAoUtszNF0OmRHXDrkKjBRjxmBX4Ay1VHwmbtL4X3sSdoQc48j08GSPCl9pLEzRHUY2maM9NB5dtzfpXsgJ9aDrg01ZMNsTEIJTvEzwv/SYuwPU7Zyg3qiZRzxY2jiIG4PTM5wV8RUEfPC6ke8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472053; c=relaxed/simple; bh=6r69o0zE75H6qw4cYsnPPRHWY+q/RRQce7FwlyNhs5o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kXvX1XLd+GLoQHQupOw3o/ve0W/cv+i5sxQcJyRGIERstg9Mu+mBwZ0752wneqrxmaFSDwpZoj575JYSA9e/xRQNmaflN4IMhAEeGEJ+NUk+yExcacLVjUqzwjVoNJ127c84zcGMYNrxym91C9gtF6wKDpudCP/icdHhdFPlQZY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=rpKSyQ3F; arc=none smtp.client-ip=95.215.58.188 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="rpKSyQ3F" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1723472049; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z+e3Q8KOZHypd1yOxyWSLWdeBIgtLiWk/Fp9jlVyymY=; b=rpKSyQ3FTDFuqrhN9P85IbxO3DCJeflCl5eY89sAc8XOADDnqMGrD2KlcIwWKevSdR6iUo f55sl8gMENhjuYLmR1wUvvgE3u2ADH7SvRlkZztQr8gR9+22z39/i/ZrRCqMmlKul1jrlZ qciR8NBE1mswWpy7ogzIejTobxoXVl4= From: Andrew Jones To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org Cc: atishp@rivosinc.com, cade.richard@berkeley.edu, jamestiotio@gmail.com Subject: [kvm-unit-tests PATCH 3/4] riscv: sbi: Prefix several environment variables with SBI Date: Mon, 12 Aug 2024 16:13:58 +0200 Message-ID: <20240812141354.119889-9-andrew.jones@linux.dev> In-Reply-To: <20240812141354.119889-6-andrew.jones@linux.dev> References: <20240812141354.119889-6-andrew.jones@linux.dev> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT Unit tests will likely share the environ so prefix variables that are specific to specific tests to avoid polluting the name space. We don't prefix generic stuff since they could be used by any test. Signed-off-by: Andrew Jones --- riscv/sbi.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/riscv/sbi.c b/riscv/sbi.c index 7b63a97deda6..3f7ca6a78cfc 100644 --- a/riscv/sbi.c +++ b/riscv/sbi.c @@ -84,30 +84,30 @@ static void check_base(void) } report_prefix_push("spec_version"); - if (env_or_skip("SPEC_VERSION")) { - expected = (long)strtoul(getenv("SPEC_VERSION"), NULL, 0); + if (env_or_skip("SBI_SPEC_VERSION")) { + expected = (long)strtoul(getenv("SBI_SPEC_VERSION"), NULL, 0); gen_report(&ret, 0, expected); } report_prefix_pop(); report_prefix_push("impl_id"); - if (env_or_skip("IMPL_ID")) { - expected = (long)strtoul(getenv("IMPL_ID"), NULL, 0); + if (env_or_skip("SBI_IMPL_ID")) { + expected = (long)strtoul(getenv("SBI_IMPL_ID"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_IMP_ID, 0); gen_report(&ret, 0, expected); } report_prefix_pop(); report_prefix_push("impl_version"); - if (env_or_skip("IMPL_VERSION")) { - expected = (long)strtoul(getenv("IMPL_VERSION"), NULL, 0); + if (env_or_skip("SBI_IMPL_VERSION")) { + expected = (long)strtoul(getenv("SBI_IMPL_VERSION"), NULL, 0); ret = __base_sbi_ecall(SBI_EXT_BASE_GET_IMP_VERSION, 0); gen_report(&ret, 0, expected); } report_prefix_pop(); report_prefix_push("probe_ext"); - expected = getenv("PROBE_EXT") ? (long)strtoul(getenv("PROBE_EXT"), NULL, 0) : 1; + expected = getenv("SBI_PROBE_EXT") ? (long)strtoul(getenv("SBI_PROBE_EXT"), NULL, 0) : 1; ret = __base_sbi_ecall(SBI_EXT_BASE_PROBE_EXT, SBI_EXT_BASE); gen_report(&ret, 0, expected); report_prefix_push("unavailable"); @@ -183,8 +183,8 @@ static void timer_check_set_timer(bool mask_timer_irq) struct sbiret ret; unsigned long begin, end, duration; const char *mask_test_str = mask_timer_irq ? " for mask irq test" : ""; - unsigned long d = getenv("TIMER_DELAY") ? strtol(getenv("TIMER_DELAY"), NULL, 0) : 200000; - unsigned long margin = getenv("TIMER_MARGIN") ? strtol(getenv("TIMER_MARGIN"), NULL, 0) : 200000; + unsigned long d = getenv("SBI_TIMER_DELAY") ? strtol(getenv("SBI_TIMER_DELAY"), NULL, 0) : 200000; + unsigned long margin = getenv("SBI_TIMER_MARGIN") ? strtol(getenv("SBI_TIMER_MARGIN"), NULL, 0) : 200000; d = usec_to_cycles(d); margin = usec_to_cycles(margin); From patchwork Mon Aug 12 14:13:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 13760668 Received: from out-182.mta1.migadu.com (out-182.mta1.migadu.com [95.215.58.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DC0F17F4FE for ; Mon, 12 Aug 2024 14:14:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472056; cv=none; b=iBrkEPiXt4/q923+izdH8DpbCOvZy0RmlKdU3MOxdw+Xy+XHTWkdiKc09qxcCjJA6yYQ2CeJctgcNMoxLrMi8TO8ezbZKC6GBzaRvEQGXC0/hFfPL4YIBRleXJ3N8yeQn1Z93yu7+j3VJ9Eg+2CUiJUje9g9sJ2yCguj3g1Ub4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723472056; c=relaxed/simple; bh=/oXneKmBI71xPFEUA6gBJcDJ67LESGlBq6GBLKcTl64=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g6TsAKUJ4b+ShuJyNk7SPbFeeYfYs3Afb2jzTFo9kVR4JL2648TrlFLEhRgsqHeuF3B5eNGpsWMCixPFTVusebl+TQn5iAYUFfsMXVHb3dpN9lfIXRAtZIdNaYM6FTlSeDU2iNya4x8L4jiNOwyL/kMQxWtSSp4nym/stYQWfkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=sPkIH0pc; arc=none smtp.client-ip=95.215.58.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="sPkIH0pc" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1723472051; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uxDUAgwyU7LZpMoLOtgb1JYYiYJmCsjV9g+S3q6q5t0=; b=sPkIH0pcIOYjgfqFJqLk8SM0SHovIHM6PcSps5yh4S0ocoeZvccTjSpAzHg86UmEhgTjMF u0OW3de8vGFvbKuKFE8DVaCGZADAD2TFTyusNSBNBJHA2Nnq1zfxWRWYAZWg7nwKeZyJgG zXzKFYACpgKZBDahttngtYEpqa/WLZM= From: Andrew Jones To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org Cc: atishp@rivosinc.com, cade.richard@berkeley.edu, jamestiotio@gmail.com Subject: [kvm-unit-tests PATCH 4/4] riscv: sbi: dbcn: Add high address tests Date: Mon, 12 Aug 2024 16:13:59 +0200 Message-ID: <20240812141354.119889-10-andrew.jones@linux.dev> In-Reply-To: <20240812141354.119889-6-andrew.jones@linux.dev> References: <20240812141354.119889-6-andrew.jones@linux.dev> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT On platforms where we have high memory (above 4G) such as on the QEMU virt machine model with over 2G of RAM configured, then we can test DBCN with addresses above 4G on 32-bit and on both 32-bit and 64-bit we can try crossing page boundaries both below 4G and from below 4G into 4G. Add those tests along with a bit of refactoring and the introduction of a couple helpers to find and check high addresses. Signed-off-by: Andrew Jones --- riscv/sbi.c | 134 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 116 insertions(+), 18 deletions(-) diff --git a/riscv/sbi.c b/riscv/sbi.c index 3f7ca6a78cfc..4f1e65dd3be6 100644 --- a/riscv/sbi.c +++ b/riscv/sbi.c @@ -5,18 +5,25 @@ * Copyright (C) 2023, Ventana Micro Systems Inc., Andrew Jones */ #include +#include #include +#include #include +#include +#include #include #include #include #include #include +#include #include #include #include #include +#define HIGH_ADDR_BOUNDARY ((phys_addr_t)1 << 32) + static void help(void) { puts("Test SBI\n"); @@ -46,6 +53,25 @@ static void split_phys_addr(phys_addr_t paddr, unsigned long *hi, unsigned long *hi = (unsigned long)(paddr >> 32); } +static bool check_addr(phys_addr_t start, phys_addr_t size) +{ + struct mem_region *r = memregions_find(start); + return r && r->end - start >= size && r->flags == MR_F_UNUSED; +} + +static phys_addr_t get_highest_addr(void) +{ + phys_addr_t highest_end = 0; + struct mem_region *r; + + for (r = mem_regions; r->end; ++r) { + if (r->end > highest_end) + highest_end = r->end; + } + + return highest_end - 1; +} + static bool env_or_skip(const char *env) { if (!getenv(env)) { @@ -266,16 +292,60 @@ static void check_time(void) #define DBCN_WRITE_TEST_STRING "DBCN_WRITE_TEST_STRING\n" #define DBCN_WRITE_BYTE_TEST_BYTE (u8)'a' +static void dbcn_write_test(const char *s, unsigned long num_bytes) +{ + unsigned long base_addr_lo, base_addr_hi; + phys_addr_t paddr = virt_to_phys((void *)s); + int num_calls = 0; + struct sbiret ret; + + split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); + + do { + ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, num_bytes, base_addr_lo, base_addr_hi); + num_bytes -= ret.value; + paddr += ret.value; + split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); + num_calls++; + } while (num_bytes != 0 && ret.error == SBI_SUCCESS); + + report(ret.error == SBI_SUCCESS, "write success (error=%ld)", ret.error); + report_info("%d sbi calls made", num_calls); +} + +static void dbcn_high_write_test(const char *s, unsigned long num_bytes, + phys_addr_t page_addr, size_t page_offset) +{ + int nr_pages = page_offset ? 2 : 1; + void *vaddr; + + if (page_addr != PAGE_ALIGN(page_addr) || page_addr + PAGE_SIZE < HIGH_ADDR_BOUNDARY || + !check_addr(page_addr, nr_pages * PAGE_SIZE)) { + report_skip("Memory above 4G required"); + return; + } + + vaddr = alloc_vpages(nr_pages); + + for (int i = 0; i < nr_pages; ++i) + install_page(current_pgtable(), page_addr + i * PAGE_SIZE, vaddr + i * PAGE_SIZE); + memcpy(vaddr + page_offset, DBCN_WRITE_TEST_STRING, num_bytes); + dbcn_write_test(vaddr + page_offset, num_bytes); +} + /* * Only the write functionality is tested here. There's no easy way to * non-interactively test the read functionality. */ static void check_dbcn(void) { - unsigned long num_bytes, base_addr_lo, base_addr_hi; + unsigned long num_bytes = strlen(DBCN_WRITE_TEST_STRING); + unsigned long base_addr_lo, base_addr_hi; + bool do_invalid_addr = false; phys_addr_t paddr; - int num_calls = 0; struct sbiret ret; + const char *tmp; + char *buf; report_prefix_push("dbcn"); @@ -286,33 +356,61 @@ static void check_dbcn(void) return; } - num_bytes = strlen(DBCN_WRITE_TEST_STRING); - paddr = virt_to_phys((void *)&DBCN_WRITE_TEST_STRING); - split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); - report_prefix_push("write"); - do { - ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, num_bytes, base_addr_lo, base_addr_hi); - num_bytes -= ret.value; - paddr += ret.value; - split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); - num_calls++; - } while (num_bytes != 0 && ret.error == SBI_SUCCESS); + dbcn_write_test(DBCN_WRITE_TEST_STRING, num_bytes); - report(ret.error == SBI_SUCCESS, "write success (error=%ld)", ret.error); - report_info("%d sbi calls made", num_calls); + assert(num_bytes < PAGE_SIZE); + + report_prefix_push("page boundary"); + buf = alloc_pages(1); + memcpy(&buf[PAGE_SIZE - num_bytes / 2], DBCN_WRITE_TEST_STRING, num_bytes); + dbcn_write_test(&buf[PAGE_SIZE - num_bytes / 2], num_bytes); + report_prefix_pop(); + + report_prefix_push("high boundary"); + tmp = getenv("SBI_DBCN_SKIP_HIGH_BOUNDARY"); + if (!tmp || atol(tmp) == 0) + dbcn_high_write_test(DBCN_WRITE_TEST_STRING, num_bytes, + HIGH_ADDR_BOUNDARY - PAGE_SIZE, PAGE_SIZE - num_bytes / 2); + else + report_skip("user disabled"); + report_prefix_pop(); + + if (__riscv_xlen == 32) { + report_prefix_push("high page"); + tmp = getenv("SBI_DBCN_SKIP_HIGH_PAGE"); + if (!tmp || atol(tmp) == 0) { + paddr = HIGH_ADDR_BOUNDARY; + tmp = getenv("HIGH_PAGE"); + if (tmp) + paddr = strtoull(tmp, NULL, 0); + dbcn_high_write_test(DBCN_WRITE_TEST_STRING, num_bytes, paddr, 0); + } else { + report_skip("user disabled"); + } + report_prefix_pop(); + } /* Bytes are read from memory and written to the console */ - if (env_or_skip("INVALID_ADDR")) { + report_prefix_push("invalid parameter"); + tmp = getenv("INVALID_ADDR_AUTO"); + if (tmp && atol(tmp) == 1) { + paddr = get_highest_addr() + 1; + do_invalid_addr = true; + } else if (env_or_skip("INVALID_ADDR")) { paddr = strtoull(getenv("INVALID_ADDR"), NULL, 0); + do_invalid_addr = true; + } + + if (do_invalid_addr) { split_phys_addr(paddr, &base_addr_hi, &base_addr_lo); ret = __dbcn_sbi_ecall(SBI_EXT_DBCN_CONSOLE_WRITE, 1, base_addr_lo, base_addr_hi); - report(ret.error == SBI_ERR_INVALID_PARAM, "invalid parameter: address (error=%ld)", ret.error); + report(ret.error == SBI_ERR_INVALID_PARAM, "address (error=%ld)", ret.error); } - report_prefix_pop(); + report_prefix_pop(); report_prefix_push("write_byte"); puts("DBCN_WRITE TEST CHAR: ");