@@ -32,7 +32,7 @@ CFLAGS += -I $(SRCDIR)/lib -I $(SRCDIR)/lib/libfdt -I lib
asm-offsets = lib/$(ARCH)/asm-offsets.h
include $(SRCDIR)/scripts/asm-offsets.mak
-cflatobjs += lib/util.o
+cflatobjs += lib/util.o lib/getchar.o
cflatobjs += lib/alloc_phys.o
cflatobjs += lib/alloc_page.o
cflatobjs += lib/vmalloc.o
@@ -61,6 +61,6 @@ fi
M+=",accel=$ACCEL"
command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
command+=" -display none -serial stdio -kernel"
-command="$(timeout_cmd) $command"
+command="$(migration_cmd) $(timeout_cmd) $command"
run_qemu $command "$@"
@@ -87,6 +87,34 @@ void puts(const char *s)
spin_unlock(&uart_lock);
}
+static int do_getchar(void)
+{
+ int c;
+
+ spin_lock(&uart_lock);
+ c = readb(uart0_base);
+ spin_unlock(&uart_lock);
+
+ return c ?: -1;
+}
+
+/*
+ * Minimalist implementation for migration completion detection.
+ * Without FIFOs enabled on the QEMU UART device we just read
+ * the data register: we cannot read more than 16 characters.
+ */
+int __getchar(void)
+{
+ int c = do_getchar();
+ static int count;
+
+ if (c != -1)
+ ++count;
+
+ assert(count < 16);
+
+ return c;
+}
/*
* Defining halt to take 'code' as an argument guarantees that it will
Let's link getchar.o to use puts and getchar from the tests. Then allow tests belonging to the migration group to trigger the migration from the test code by putting "migrate" into the uart. Then the code can wait for the migration completion by using getchar(). The __getchar implement is minimalist as it just reads the data register. It is just meant to read the single character emitted at the end of the migration by the runner script. It is not meant to read more data (FIFOs are not enabled). Signed-off-by: Eric Auger <eric.auger@redhat.com> --- v3 -> v4: - remove space around Elvis operator - rename ___getchar into do_getchar v2 -> v3: - take the lock - assert if more than 16 chars - removed Thomas' R-b --- arm/Makefile.common | 2 +- arm/run | 2 +- lib/arm/io.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-)