@@ -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,12 @@ cat <<EOF > lib/config.h
* Generated file. DO NOT MODIFY.
*
*/
+
EOF
if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
cat <<EOF >> lib/config.h
-#define CONFIG_UART_EARLY_BASE 0x09000000
+#define CONFIG_UART_EARLY_BASE ${arm_uart_early_addr}
EOF
fi
@@ -21,10 +21,10 @@ 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.
*/
#define UART_EARLY_BASE (u8 *)(unsigned long)CONFIG_UART_EARLY_BASE
@@ -32,22 +32,31 @@ static volatile u8 *uart0_base = 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();
}