On Fri, Feb 01, 2019 at 11:16:39AM +0000, Alexandru Elisei wrote:
> When kvm-unit-tests is configured with --vmm=kvmtool, use the address for
> the ns16550a UART that kvmtool emulates. When the virtual machine manager
> is QEMU, use the address for the pl011 UART, as before.
>
> Signed-off-by: Alexandru Elisei <[email protected]>
> ---
> configure | 10 +++++++---
> lib/arm/io.c | 27 ++++++++++++++++++---------
> 2 files changed, 25 insertions(+), 12 deletions(-)
>
> diff --git a/configure b/configure
> index 0786e1604dba..f81352243dd8 100755
> --- a/configure
> +++ b/configure
> @@ -114,7 +114,11 @@ if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then
> testdir=x86
> elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
> testdir=arm
> - if [ "$vmm" != "qemu" ] && [ "$vmm" != "kvmtool" ]; then
> + if [ "$vmm" = "qemu" ]; then
> + arm_uart_early_addr=0x09000000
> + elif [ "$vmm" = "kvmtool" ]; then
> + arm_uart_early_addr=0x3f8
> + else
> echo '--vmm must be one of "qemu" or "kvmtool"!'
> usage
> fi
> @@ -216,11 +220,11 @@ cat <<EOF > lib/config.h
> * Generated file. DO NOT MODIFY.
> *
> */
> +
> EOF
> if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
> cat <<EOF >> lib/config.h
> -
> -#define UART_EARLY_BASE (unsigned long)0x09000000
> +#define UART_EARLY_BASE (unsigned long)${arm_uart_early_addr}
>
> EOF
> fi
> diff --git a/lib/arm/io.c b/lib/arm/io.c
> index 0973885d19f5..0d5ab9510ec8 100644
> --- a/lib/arm/io.c
> +++ b/lib/arm/io.c
> @@ -21,32 +21,41 @@ extern void halt(int code);
>
> static struct spinlock uart_lock;
> /*
> - * Use this guess for the pl011 base in order to make an attempt at
> + * Use this guess for the uart base in order to make an attempt at
> * having earlier printf support. We'll overwrite it with the real
> * base address that we read from the device tree later. This is
> - * the address we expect QEMU's mach-virt machine type to put in
> + * the address we expect the virtual machine manager to put in
> * its generated device tree.
> */
Ah, I see. This comment is now updated. Please disregard my previous
comment about it.
> static volatile u8 *uart0_base = (u8 *)UART_EARLY_BASE;
>
> static void uart0_init(void)
> {
> - const char *compatible = "arm,pl011";
> + /*
> + * kvm-unit-tests uses the uart only for output. Both uart models have
> + * the TX register at offset 0 from the base address, so there is no
> + * need to treat them separately.
> + */
> + const char *compatible[] = {"arm,pl011", "ns16550a"};
> struct dt_pbus_reg base;
> - int ret;
> + int i, ret;
>
> ret = dt_get_default_console_node();
> assert(ret >= 0 || ret == -FDT_ERR_NOTFOUND);
>
> if (ret == -FDT_ERR_NOTFOUND) {
>
> - ret = dt_pbus_get_base_compatible(compatible, &base);
> - assert(ret == 0 || ret == -FDT_ERR_NOTFOUND);
> + for (i = 0; i < ARRAY_SIZE(compatible); i++) {
> + ret = dt_pbus_get_base_compatible(compatible[i], &base);
> + assert(ret == 0 || ret == -FDT_ERR_NOTFOUND);
> +
> + if (ret == 0)
> + break;
> + }
>
> if (ret) {
> - printf("%s: %s not found in the device tree, "
> - "aborting...\n",
> - __func__, compatible);
> + printf("%s: Compatible uart not found in the device
> tree, "
> + "aborting...\n", __func__);
> abort();
> }
>
> --
> 2.17.0
>
Reviewed-by: Andrew Jones <[email protected]>
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm