From nobody Fri Jul 7 20:04:31 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QyPW41z8vz4lh5x; Fri, 7 Jul 2023 20:04:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QyPW41YnWz3xYr; Fri, 7 Jul 2023 20:04:32 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688760272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=yWh5qaC8KjIk2xzwULK89DbC5gwTrPRwDeKAvvLKShU=; b=NSkjCC1rjpcVJ3l0JrmpNYzg+AppbduZ3tTQ0T2Qtwh32lIVApVYv7/liCoeOnZn84m47y RMvrMMlYqMZWocxblqb3HkDSfiLV8GJyimPZ9FZzPLXT/Ed/DY4OI4HZUVH+f+WJFdaO3o WQgqOp1WZWH5ejefR58v0dD57bUz+kMgCIy5XRgbzxRMgUKQ8NZCxfQGZPMSwYJZOqZj/k jd7JjJRrMn8Wr3uSp1DLmCt+prvGTY/unBPAKsckyqTR3AKhZbKMtUMlQ2uP5GQ5NLuVcR PuwPG23UhcVI5aif8fhKMjn5s74+2oDCrF6ynKcQrd+m7FT1aGf0HDvjbaSC5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688760272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=yWh5qaC8KjIk2xzwULK89DbC5gwTrPRwDeKAvvLKShU=; b=lsS3N+sM9stAsuYYaKxQkFyo1aTqYOr16D0+h79BU1+c8ZWq6OZkWKh0U6s0yXTfHLH6Wc OiOL2eP9FHymvb+tlDr3p/VE6sNKI7SzykEp9EvOkvvBfBY0G5Nf7STKHo0+y5BB/G3xSv Xdm8lMZ05Mdeb3XwU/8Xst9X0GFLWJmtJH1IqF1TIpG/21jc4SBsWPXXl1kp9spzX29YtA QMeatHc8T8A9B3xqrOcRs3iqq7zYZYbUDC2MXMJWQu4Qb/Zo18AQSrKdM3Iqn+49IT3iDQ sU02p5adCICIXgmEv7VvBuz5RgKaBIb5h3dodoa4GWK8jzrBHOsvI+mLSZs8tw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1688760272; a=rsa-sha256; cv=none; b=FZ5eKRCNfHvjbO0T2DXHNZya+WzHyeW/9V6pTDd5Z/68jp0mBODwgvTtdFxU5c4Pk/xjFD XbVhDvho9qLGCTKsOXRc15nNzxvckOckciN4v59PBG7HU7rEk+iZvZWBfjic6sZByg1z+E o5ymsg4z7Oz3kequtpTnGxUAdisT8QBGfU8TwYVFIqCAvxmDCli5w1uv4xdpmRm/TdX1Rc MTUcmq14rZ1X0w514V/h95t8x5hNXIQjB/ScwAD1jOnLsbr7ghjQ+h1XUyxRzfIXO/qKX7 opQO9omHvlXBAZKzYxBz0mlgjcrfecTx9e3O4QFFzFuI3L4z/ktOuXE5id5uTQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QyPW40fJRzs77; Fri, 7 Jul 2023 20:04:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 367K4Vjt029564; Fri, 7 Jul 2023 20:04:31 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 367K4VOG029563; Fri, 7 Jul 2023 20:04:31 GMT (envelope-from git) Date: Fri, 7 Jul 2023 20:04:31 GMT Message-Id: <202307072004.367K4VOG029563@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: d8bfccb22093 - main - fwctl_fetch: A small test utility for the fwctl bhyve device. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d8bfccb220939e121b6323700c634a5dff95b4ac Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=d8bfccb220939e121b6323700c634a5dff95b4ac commit d8bfccb220939e121b6323700c634a5dff95b4ac Author: John Baldwin AuthorDate: 2023-07-07 20:02:13 +0000 Commit: John Baldwin CommitDate: 2023-07-07 20:02:13 +0000 fwctl_fetch: A small test utility for the fwctl bhyve device. This can be run inside a bhyve guest to query the value of fwctl nodes. Note that fwctl in bhyve only supports a single hw.ncpu node. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D40803 --- tools/tools/bhyve/Makefile | 8 +++ tools/tools/bhyve/fwctl_fetch.c | 137 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/tools/tools/bhyve/Makefile b/tools/tools/bhyve/Makefile new file mode 100644 index 000000000000..3d9ea4167bab --- /dev/null +++ b/tools/tools/bhyve/Makefile @@ -0,0 +1,8 @@ +PROGS= fwctl_fetch +MAN= +BINDIR?= /usr/local/bin + +# fwctl_fetch: fetch the value of fwctl nodes from a guest +LIBADD.fwctl_fetch+= util + +.include diff --git a/tools/tools/bhyve/fwctl_fetch.c b/tools/tools/bhyve/fwctl_fetch.c new file mode 100644 index 000000000000..f3139cf4f010 --- /dev/null +++ b/tools/tools/bhyve/fwctl_fetch.c @@ -0,0 +1,137 @@ +/*- + * Copyright (c) 2023 John Baldwin + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define OP_GET 3 +#define OP_GET_LEN 4 + +/* I/O ports */ +#define FWCTL_OUT 0x510 +#define FWCTL_IN 0x511 + +static void +reset_fwctl(void) +{ + char buf[4]; + + outw(FWCTL_OUT, 0); + for (u_int i = 0; i < 4; i++) + buf[i] = inb(FWCTL_IN); + if (memcmp(buf, "BHYV", 4) != 0) + errx(1, "Signature mismatch: %.4s", buf); +} + +static void +send_node_name(const char *name) +{ + uint32_t value; + size_t len; + + len = strlen(name) + 1; + while (len > 4) { + memcpy(&value, name, 4); + outl(FWCTL_OUT, value); + name += 4; + len -= 4; + } + + if (len > 0) { + value = 0; + memcpy(&value, name, len); + outl(FWCTL_OUT, value); + } +} + +static void +fwctl_op(uint32_t op, uint32_t id, const char *name, void *buf, size_t len) +{ + char *cp; + uint32_t value, rsplen; + + /* Length */ + outl(FWCTL_OUT, 12 + strlen(name) + 1); + + /* Operation */ + outl(FWCTL_OUT, op); + + /* Transaction ID */ + outl(FWCTL_OUT, id); + + send_node_name(name); + + /* Length */ + rsplen = inl(FWCTL_IN); + + /* If there is an error, the response will have no payload. */ + if (rsplen < 4 * sizeof(value)) + errx(1, "Invalid response length (%u): %u", id, rsplen); + + /* Operation */ + value = inl(FWCTL_IN); + if (value != op) + errx(1, "Invalid response type (%u): %u", id, value); + + /* Transaction ID */ + value = inl(FWCTL_IN); + if (value != id) + errx(1, "Invalid response ID (%u): %u", id, value); + + /* Error */ + value = inl(FWCTL_IN); + if (value != 0) + errx(1, "Error from op %u (%u): %u", op, id, value); + + /* If there wasn't an error, require payload length to match */ + if (rsplen != 4 * sizeof(value) + len) + errx(1, "Response payload length mismatch (%u): %zu vs %zu", id, + rsplen - 4 * sizeof(value), len); + + cp = buf; + while (len > 0) { + value = inl(FWCTL_IN); + memcpy(cp, &value, 4); + cp += 4; + len -= 4; + } +} + +int +main(int ac, char **av) +{ + char *p; + size_t len, buflen, len2; + + if (ac != 2) + errx(1, "Need node name"); + + if (open("/dev/io", O_RDWR) == -1) + err(1, "Failed to open /dev/io"); + + reset_fwctl(); + + fwctl_op(OP_GET_LEN, 1, av[1], &len, sizeof(len)); + if (len == 0) + errx(1, "Node has length of 0"); + + /* Buffer includes embedded length followed by value. */ + buflen = sizeof(size_t) + roundup2(len, 4); + p = malloc(buflen); + fwctl_op(OP_GET, 2, av[1], p, buflen); + memcpy(&len2, p, sizeof(len2)); + if (len2 != len) + errx(1, "Length mismatch: %zu vs %zu", len, len2); + hexdump(p + sizeof(len2), len, NULL, 0); + + return (0); +}