From: Christoffer Dall <christoffer.dall@linaro.org>
To: Andrew Jones <drjones@redhat.com>
Cc: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, gleb@redhat.com
Subject: Re: [PATCH 6/9] Introduce virtio-testdev
Date: Wed, 16 Oct 2013 18:06:14 -0700 [thread overview]
Message-ID: <20131017010614.GH24837@cbox> (raw)
In-Reply-To: <1381767815-12510-7-git-send-email-drjones@redhat.com>
On Mon, Oct 14, 2013 at 06:23:32PM +0200, Andrew Jones wrote:
> virtio-testdev is a communication channel to qemu through virtio that
> can be used by test code to send commands. The only command currently
> implemented is EXIT, which allows the test code to exit with a given
> status code.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> lib/bswap.h | 7 +++
> lib/libcflat.h | 10 ++++
> lib/virtio-testdev.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++
> lib/virtio-testdev.h | 9 ++++
> 4 files changed, 152 insertions(+)
> create mode 100644 lib/bswap.h
> create mode 100644 lib/virtio-testdev.c
> create mode 100644 lib/virtio-testdev.h
>
> diff --git a/lib/bswap.h b/lib/bswap.h
> new file mode 100644
> index 0000000000000..e63c4d37a8b9a
> --- /dev/null
> +++ b/lib/bswap.h
> @@ -0,0 +1,7 @@
> +#ifndef _BSWAP_H_
> +#define _BSWAP_H_
> +#define le32_to_cpu(x) (x)
> +#define cpu_to_le32(x) (x)
> +#define le16_to_cpu(x) (x)
> +#define cpu_to_le16(x) (x)
> +#endif
> diff --git a/lib/libcflat.h b/lib/libcflat.h
> index a1be635ab4ee9..41791194657d0 100644
> --- a/lib/libcflat.h
> +++ b/lib/libcflat.h
> @@ -37,6 +37,16 @@ typedef _Bool bool;
> #define true 1
> #define false 0
>
> +typedef u32 compat_ptr_t;
> +static inline void *compat_ptr(compat_ptr_t ptr)
> +{
> + return (void *)(unsigned long)ptr;
> +}
> +static inline compat_ptr_t ptr_to_compat(void *ptr)
> +{
> + return (u32)(unsigned long)ptr;
> +}
> +
> extern void halt(int code);
> extern void exit(int code);
>
> diff --git a/lib/virtio-testdev.c b/lib/virtio-testdev.c
> new file mode 100644
> index 0000000000000..900921302c344
> --- /dev/null
> +++ b/lib/virtio-testdev.c
There's an interesting mix of space and tab indentations in this file...
I assume using the kernel coding style would be approprate here...
Actually, that could be added to the readme too. (Or whichever format we
choose).
Could you fix?
> @@ -0,0 +1,126 @@
> +#include "libcflat.h"
> +#include "iomaps.h"
> +#include "bswap.h"
> +
> +#define TESTDEV_MAJOR_VER 1
> +#define TESTDEV_MINOR_VER 1
> +
> +#define VIRTIO_MMIO_DEVICEID 0x8
> +#define VIRTIO_ID_TESTDEV 0xffff
> +#define DEV_CONFIG_BASE 0x100
> +#define DEV_CONFIG_SIZE 0x100
> +
> +enum { VERSION = 1, CLEAR, EXIT, };
> +enum { TOKEN, NARGS, NRETS, ARG1, ARG2, ARG3, ARG4, };
> +
> +#define RET1(nargs) (ARG1 + (nargs) + 0)
> +#define RET2(nargs) (ARG1 + (nargs) + 1)
> +#define RET3(nargs) (ARG1 + (nargs) + 2)
> +#define RET4(nargs) (ARG1 + (nargs) + 3)
> +
> +static u32 *testdev_base;
> +
> +/*
> + * We have to write all args; nargs, nrets, ... first to
> + * avoid executing token's operation until all args are in
> + * place. Then issue the op, and then read the rets. Reading
> + * the rets (or just sanity checking by reading base[0]) will
> + * read a zero into qemu's copy of the token, which allows us
> + * to prepare additional ops without re-executing the last one.
> + */
> +void virtio_testdev(u32 token, u32 nargs, u32 nrets, ...)
> +{
> + volatile u32 *base = testdev_base;
> + volatile u32 *tdp = base + 1;
> + va_list va;
> +
> + if (!testdev_base)
> + return;
> +
> + *tdp++ = cpu_to_le32(nargs);
> + *tdp++ = cpu_to_le32(nrets);
> +
> + va_start(va, nrets);
> +
> + while (nargs--)
> + *tdp++ = cpu_to_le32(va_arg(va, unsigned));
> +
> + /* this runs the op, but then resets base[0] to zero */
> + base[0] = cpu_to_le32(token);
> +
> + /* sanity check */
> + if (base[0] != 0) {
> + printf("virtio-testdev base[0] should always be zero!\n");
> + halt(EIO);
> + }
> +
> + while (nrets--) {
> + u32 *r = va_arg(va, unsigned *);
> + *r = le32_to_cpu(*tdp++);
> + }
> +
> + va_end(va);
> +}
> +
> +void virtio_testdev_version(u32 *version)
> +{
> + virtio_testdev(VERSION, 0, 1, version);
> +}
> +
> +void virtio_testdev_clear(void)
> +{
> + virtio_testdev(CLEAR, 0, 0);
> +}
> +
> +void virtio_testdev_exit(int code)
> +{
> + virtio_testdev(EXIT, 1, 0, code);
> +}
> +
> +void virtio_testdev_init(void)
> +{
> + struct iomap *m;
> + u32 version, i;
> + u16 major, minor;
> +
> + m = iomaps_find("virtio_mmio");
> + if (!m) {
> + printf("No virtio-mmio transports for virtio-testdev found!\n");
> + halt(ENODEV);
> + }
> +
> + for (i = 0; i < m->nr; ++i) {
> + volatile u32 *base = (u32 *)compat_ptr(m->addrs[i]);
> + u32 devid32 = base[VIRTIO_MMIO_DEVICEID / 4];
do we have readl/writel in this framework? If not, maybe we should to
indicate IO read/writes and ensure the compiler doesn't reorder things
and that we have the necessary memory barriers etc...?
That would apply to virtio_testdev above as well.
> + u16 devid = devid32 & 0xffff;
> + devid = le16_to_cpu(devid);
> + if (devid == VIRTIO_ID_TESTDEV) {
> + testdev_base = (u32 *)compat_ptr(m->addrs[i] + DEV_CONFIG_BASE);
> + break;
> + }
> + }
> +
> + if (!testdev_base) {
> + printf("Can't find virtio-testdev. Is '-device virtio-testdev' "
> + "on the qemu command line?\n");
> + halt(ENODEV);
> + }
> +
> + virtio_testdev_version(&version);
> + major = version >> 16;
> + minor = version & 0xffff;
> +
> + if (major != TESTDEV_MAJOR_VER || minor < TESTDEV_MINOR_VER) {
> + char *u = "qemu";
> + if (major > TESTDEV_MAJOR_VER)
> + u = "kvm-unit-tests";
> + printf("Refusing to run with virtio-testdev major = %d, minor = %d\n",
> + major, minor);
"Refusing to run"?
How about "incompatible version of virtio-testdev"?
> + printf("Update %s.\n", u);
> + exit(ENODEV);
> + }
> +
> + if (minor > TESTDEV_MINOR_VER)
> + printf("testdev has new features. "
> + "An update of kvm-unit-tests may be possible.\n");
> +}
> diff --git a/lib/virtio-testdev.h b/lib/virtio-testdev.h
> new file mode 100644
> index 0000000000000..c10bbfb591d0b
> --- /dev/null
> +++ b/lib/virtio-testdev.h
> @@ -0,0 +1,9 @@
> +#ifndef _VIRTIO_TESTDEV_H_
> +#define _VIRTIO_TESTDEV_H_
> +#include "libcflat.h"
> +
> +extern void virtio_testdev_init(void);
> +extern void virtio_testdev_version(u32 *version);
> +extern void virtio_testdev_clear(void);
> +extern void virtio_testdev_exit(int code);
> +#endif
> --
> 1.8.1.4
>
next prev parent reply other threads:[~2013-10-17 1:05 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-14 16:23 [PATCH 0/9] kvm-unit-tests/arm: initial drop Andrew Jones
2013-10-14 16:23 ` [PATCH 1/9] remove unused files Andrew Jones
2013-10-16 12:52 ` Gleb Natapov
2013-10-16 13:13 ` Alexander Graf
2013-10-16 13:13 ` Alexander Graf
2013-10-16 13:18 ` Andrew Jones
2013-10-14 16:23 ` [PATCH 2/9] makefile and run_tests tweaks Andrew Jones
2013-10-14 16:23 ` [PATCH 3/9] clean root dir of all x86-ness Andrew Jones
2013-10-17 1:06 ` Christoffer Dall
2013-10-17 9:35 ` Andrew Jones
2013-10-17 19:01 ` Christoffer Dall
2013-10-20 16:37 ` Andrew Jones
2013-10-14 16:23 ` [PATCH 4/9] Introduce a simple iomap structure Andrew Jones
2013-10-14 16:23 ` [PATCH 5/9] Add halt() and some error codes Andrew Jones
2013-10-14 16:23 ` [PATCH 6/9] Introduce virtio-testdev Andrew Jones
2013-10-15 8:39 ` Andrew Jones
2013-10-17 1:06 ` Christoffer Dall [this message]
2013-10-17 9:51 ` Andrew Jones
2013-10-17 19:01 ` Christoffer Dall
2013-10-17 1:06 ` Christoffer Dall
2013-10-14 16:23 ` [PATCH 7/9] arm: replace arbitrary divisions Andrew Jones
2013-10-17 1:06 ` Christoffer Dall
2013-10-17 10:03 ` Andrew Jones
2013-10-17 18:59 ` Christoffer Dall
2013-10-14 16:23 ` [PATCH 8/9] arm: initial drop Andrew Jones
2013-10-17 1:06 ` Christoffer Dall
2013-10-17 10:16 ` Andrew Jones
2013-10-17 13:28 ` Andrew Jones
2013-10-17 18:39 ` Christoffer Dall
2013-10-14 16:23 ` [PATCH 9/9] arm: add vectors support Andrew Jones
2013-10-17 1:06 ` Christoffer Dall
2013-10-17 10:38 ` Andrew Jones
2013-10-17 18:58 ` Christoffer Dall
2013-10-20 16:35 ` Andrew Jones
2013-10-21 9:59 ` Christoffer Dall
2013-11-20 23:06 ` [PATCH 0/9] kvm-unit-tests/arm: initial drop María Soler Heredia
2013-11-26 17:23 ` Andrew Jones
2013-12-29 9:24 ` Christoffer Dall
2014-01-02 18:56 ` Andrew Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131017010614.GH24837@cbox \
--to=christoffer.dall@linaro.org \
--cc=drjones@redhat.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.