[v3,for-next,02/11] configs/qemu{x86, x86_64}: add a serial console
diff mbox series

Message ID 20191117201909.12900-3-romain.naour@smile.fr
State New
Headers show
Series
  • gitlab Qemu runtime testing
Related show

Commit Message

Romain Naour Nov. 17, 2019, 8:19 p.m. UTC
The current Buildroot defconfigs for qemu_x86 and qemu_x86_64
instantiate a console on tty1, which appears on QEMU's
graphical window. Add a console on the serial port (ttyS0) to
be used later for gitlab testing.

This change is need since the script used for gitlab testing
needs to use a serial output with pexpect.

This change is similar to the one made for raspberrypi [1] to
handle HDMI and serial console:

This requires three changes:
 1. have two 'console=' entries in the kernel command line: tty1,
    then ttyS0;
 2. change BR2_TARGET_GENERIC_GETTY_PORT to "console", so it starts
    a getty on the last console= passed to the kernel, ttyS0;
 3. add a new getty on tty1 to the generated inittab.

Step 2 is actually obtained by removing BR2_TARGET_GENERIC_GETTY_PORT
entirely from the defconfigs, since "console" is the default value.

Step 3 requires a post-build script since the Buildroot makefiles can
configure only one console.

Note: instead of simply adding a new getty on ttyS0 (which would
work) this patch actually changes BR2_TARGET_GENERIC_GETTY_PORT to
instantiate a console on UART, then adds back tty1 via
post-build.sh. This is done only to avoid the "GENERIC_SERIAL" comment
where we instantiate a console on QEMU graphical window, then
instantiate a really-serial console on another line.

The result is these two inittab lines:

  console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL
  tty1::respawn:/sbin/getty -L  tty1 0 vt100 # QEMU graphical window

[1] 20878a1017e2bf7eb8c5f870dc6d2641493cb0f9

Signed-off-by: Romain Naour <romain.naour@smile.fr>
---
 board/qemu/x86/post-build.sh    | 11 +++++++++++
 board/qemu/x86/readme.txt       |  2 +-
 board/qemu/x86_64/post-build.sh | 11 +++++++++++
 board/qemu/x86_64/readme.txt    |  2 +-
 configs/qemu_x86_64_defconfig   |  4 ++--
 configs/qemu_x86_defconfig      |  4 ++--
 6 files changed, 28 insertions(+), 6 deletions(-)
 create mode 100755 board/qemu/x86/post-build.sh
 create mode 100755 board/qemu/x86_64/post-build.sh

Comments

Carlos Santos Nov. 22, 2019, 11:27 a.m. UTC | #1
On Sun, Nov 17, 2019 at 5:19 PM Romain Naour <romain.naour@smile.fr> wrote:
>
> The current Buildroot defconfigs for qemu_x86 and qemu_x86_64
> instantiate a console on tty1, which appears on QEMU's
> graphical window. Add a console on the serial port (ttyS0) to
> be used later for gitlab testing.
>
> This change is need since the script used for gitlab testing
> needs to use a serial output with pexpect.
>
> This change is similar to the one made for raspberrypi [1] to
> handle HDMI and serial console:

I think the serial console should be the default on all qemu
defconfigs, since it best matches embedded devices.

In the long run it should be possible to configure additional ttys by
means of a cleaner and standard mechanism. I even sketched it by meas
of a BR2_TARGET_GETTY_PORTS list some time but lost it when moved to a
new job. I will try to recreate it and submit a draft for review.
Romain Naour Nov. 22, 2019, 12:42 p.m. UTC | #2
Hi Carlos,

Thanks for your feedback!

Le 22/11/2019 à 12:27, Carlos Santos a écrit :
> On Sun, Nov 17, 2019 at 5:19 PM Romain Naour <romain.naour@smile.fr> wrote:
>>
>> The current Buildroot defconfigs for qemu_x86 and qemu_x86_64
>> instantiate a console on tty1, which appears on QEMU's
>> graphical window. Add a console on the serial port (ttyS0) to
>> be used later for gitlab testing.
>>
>> This change is need since the script used for gitlab testing
>> needs to use a serial output with pexpect.
>>
>> This change is similar to the one made for raspberrypi [1] to
>> handle HDMI and serial console:
> 
> I think the serial console should be the default on all qemu
> defconfigs, since it best matches embedded devices.

At least it's the common starting point when you start working with Buildroot
and a new embedded device.

Only x86 qemu defconfig was not using the serial console by default.

> 
> In the long run it should be possible to configure additional ttys by
> means of a cleaner and standard mechanism. I even sketched it by meas
> of a BR2_TARGET_GETTY_PORTS list some time but lost it when moved to a
> new job. I will try to recreate it and submit a draft for review.
> 

Ok.

Best regards,
Romain

Patch
diff mbox series

diff --git a/board/qemu/x86/post-build.sh b/board/qemu/x86/post-build.sh
new file mode 100755
index 0000000000..bf83a002c2
--- /dev/null
+++ b/board/qemu/x86/post-build.sh
@@ -0,0 +1,11 @@ 
+#!/bin/sh
+
+set -u
+set -e
+
+# Add a console on tty1
+if [ -e ${TARGET_DIR}/etc/inittab ]; then
+    grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
+	sed -i '/GENERIC_SERIAL/a\
+tty1::respawn:/sbin/getty -L  tty1 0 vt100 # QEMU graphical window' ${TARGET_DIR}/etc/inittab
+fi
diff --git a/board/qemu/x86/readme.txt b/board/qemu/x86/readme.txt
index 42fc2439da..3bbafecf91 100644
--- a/board/qemu/x86/readme.txt
+++ b/board/qemu/x86/readme.txt
@@ -1,6 +1,6 @@ 
 Run the emulation with:
 
-  qemu-system-i386 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda" -net nic,model=virtio -net user
+  qemu-system-i386 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda console=tty1 console=ttyS0" -serial stdio -net nic,model=virtio -net user
 
 Optionally add -smp N to emulate a SMP system with N CPUs.
 
diff --git a/board/qemu/x86_64/post-build.sh b/board/qemu/x86_64/post-build.sh
new file mode 100755
index 0000000000..bf83a002c2
--- /dev/null
+++ b/board/qemu/x86_64/post-build.sh
@@ -0,0 +1,11 @@ 
+#!/bin/sh
+
+set -u
+set -e
+
+# Add a console on tty1
+if [ -e ${TARGET_DIR}/etc/inittab ]; then
+    grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
+	sed -i '/GENERIC_SERIAL/a\
+tty1::respawn:/sbin/getty -L  tty1 0 vt100 # QEMU graphical window' ${TARGET_DIR}/etc/inittab
+fi
diff --git a/board/qemu/x86_64/readme.txt b/board/qemu/x86_64/readme.txt
index 4a1c0c0ff5..93ac22a947 100644
--- a/board/qemu/x86_64/readme.txt
+++ b/board/qemu/x86_64/readme.txt
@@ -1,6 +1,6 @@ 
 Run the emulation with:
 
-  qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda" -net nic,model=virtio -net user
+  qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda console=tty1 console=ttyS0" -serial stdio -net nic,model=virtio -net user
 
 Optionally add -smp N to emulate a SMP system with N CPUs.
 
diff --git a/configs/qemu_x86_64_defconfig b/configs/qemu_x86_64_defconfig
index c3c0991fcc..f9d868d169 100644
--- a/configs/qemu_x86_64_defconfig
+++ b/configs/qemu_x86_64_defconfig
@@ -3,11 +3,11 @@  BR2_x86_64=y
 
 # System
 BR2_SYSTEM_DHCP="eth0"
-BR2_TARGET_GENERIC_GETTY_PORT="tty1"
 
-# Filesystem
+# Filesystem / image
 BR2_TARGET_ROOTFS_EXT2=y
 # BR2_TARGET_ROOTFS_TAR is not set
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh"
 
 # Linux headers same as kernel, a 4.19 series
 BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_19=y
diff --git a/configs/qemu_x86_defconfig b/configs/qemu_x86_defconfig
index 6d68b7d71f..cb68b5f4ff 100644
--- a/configs/qemu_x86_defconfig
+++ b/configs/qemu_x86_defconfig
@@ -4,11 +4,11 @@  BR2_x86_pentiumpro=y
 
 # System
 BR2_SYSTEM_DHCP="eth0"
-BR2_TARGET_GENERIC_GETTY_PORT="tty1"
 
-# Filesystem
+# Filesystem / image
 BR2_TARGET_ROOTFS_EXT2=y
 # BR2_TARGET_ROOTFS_TAR is not set
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86/post-build.sh"
 
 # Linux headers same as kernel, a 4.19 series
 BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_19=y