[PATCH] RFC: efi: Attempt to support automatically running SCT

This is a feeble attempt to update the qemu script to run a selection of UEFI tests. It copies a .seq file into the disk so it can be read by SCT.
It doesn't seem to work and I am not sure why. I am posting it in case someone else has ideas or wants to pic it up.
Once Ilias' CI solution is in place, I can perhaps come back to this.
Signed-off-by: Simon Glass sjg@chromium.org ---
scripts/build-qemu.sh | 56 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-)
diff --git a/scripts/build-qemu.sh b/scripts/build-qemu.sh index 0ff53593cf9..f9ee0072573 100755 --- a/scripts/build-qemu.sh +++ b/scripts/build-qemu.sh @@ -21,20 +21,28 @@ usage() { fi echo "Usage: $0 -aBkrsw" echo - echo " -a - Select architecture (arm, x86)" - echo " -B - Don't build; assume a build exists" - echo " -k - Use kvm (kernel-based Virtual Machine)" - echo " -o - Run Operating System ('ubuntu' only for now)" - echo " -r - Run QEMU with the image" - echo " -R - Select OS release (e.g. 24.04)" - echo " -s - Use serial only (no display)" - echo " -w - Use word version (32-bit)" ) >&2 + echo " -a <arch> - Select architecture (arm, x86)" + echo " -B - Don't build; assume a build exists" + echo " -e - Run UEFI Self-Certification Test (SCT)" + echo " -k - Use kvm (kernel-based Virtual Machine)" + echo " -o <name> - Run Operating System ('ubuntu' only for now)" + echo " -r - Run QEMU with the image" + echo " -R <os> - Select OS release (e.g. 24.04)" + echo " -s - Use serial only (no display)" + echo " -S <seq> - Select SCT sequence-file" + echo " -w - Use word version (32-bit)" ) >&2 exit 1 }
# Directory tree for OS images imagedir=${imagedir-/vid/software/linux}
+# Directory for UEFI Self-Certification Test (SCT) +sctdir=${sctdir-/vid/software/devel/uefi/sct} + +# Mount point for use when writing to disk images +mnt=${mnt-/mnt} + # architecture (arm or x86) arch=arm
@@ -65,7 +73,7 @@ kvm= # We avoid in-tree build because it gets confusing trying different builds ubdir=${ubdir-/tmp/b}
-while getopts "a:Bko:rR:sw" opt; do +while getopts "a:Beko:rR:sS:w" opt; do case "${opt}" in a) arch=$OPTARG @@ -73,6 +81,17 @@ while getopts "a:Bko:rR:sw" opt; do B) build= ;; + e) + extra+=" -m 4G -smp 4" + extra+=" -display none" + extra+=" -device virtio-gpu-pci" + extra+=" -device qemu-xhci" + extra+=" -device usb-kbd" + extra+=" -drive file=${sctdir}/sct.img,format=raw,if=none,id=vda" + extra+=" -device virtio-blk-device,drive=vda,bootindex=1" + extra+=" -device virtio-net-device,netdev=net0" + extra+=" -netdev user,id=net0" + ;; k) kvm="-enable-kvm" ;; @@ -91,6 +110,9 @@ while getopts "a:Bko:rR:sw" opt; do s) serial=1 ;; + S) + seq=$OPTARG + ;; w) bitness=32 ;; @@ -105,6 +127,19 @@ build_u_boot() { buildman -w -o $DIR --board $BOARD -I || exit $? }
+# Write the SCT test-sequence file into the SCT image +update_sct_seq() { + if [[ -z "${seq}" ]]; then + return + fi + LOOP=$(sudo losetup --show -f -P "${sctdir}/sct.img") + PART="${LOOP}p1" + sudo mount -o loop ${PART} ${mnt} -o uid=$(id -u),gid=$(id -g) + cp "${seq}" "${mnt}/." + sudo umount ${mnt} + sudo losetup -d ${LOOP} +} + # Run QEMU with U-Boot run_qemu() { if [[ -n "${os_image}" ]]; then @@ -129,7 +164,7 @@ arm) BOARD="qemu_arm" BIOS="u-boot.bin" qemu=qemu-system-arm - extra+=" -machine virt" + extra+=" -machine virt -accel tcg" suffix="arm" if [[ "${bitness}" == "64" ]]; then BOARD="qemu_arm64" @@ -168,6 +203,7 @@ DIR=${ubdir}/${BOARD}
if [[ -n "${build}" ]]; then build_u_boot + update_sct_seq fi
if [[ -n "${run}" ]]; then

Hi,
On Tue, 10 Dec 2024 at 17:46, Simon Glass sjg@chromium.org wrote:
This is a feeble attempt to update the qemu script to run a selection of UEFI tests. It copies a .seq file into the disk so it can be read by SCT.
It doesn't seem to work and I am not sure why. I am posting it in case someone else has ideas or wants to pic it up.
Once Ilias' CI solution is in place, I can perhaps come back to this.
Signed-off-by: Simon Glass sjg@chromium.org
scripts/build-qemu.sh | 56 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-)
I'm pulling this in as the base script was rejected for Tom's tree anyway.
Applied to sjg/master, thanks!

On 11.12.24 01:46, Simon Glass wrote:
This is a feeble attempt to update the qemu script to run a selection of UEFI tests. It copies a .seq file into the disk so it can be read by SCT.
It doesn't seem to work and I am not sure why. I am posting it in case someone else has ideas or wants to pic it up.
Once Ilias' CI solution is in place, I can perhaps come back to this.
Signed-off-by: Simon Glass sjg@chromium.org
scripts/build-qemu.sh | 56 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-)
diff --git a/scripts/build-qemu.sh b/scripts/build-qemu.sh index 0ff53593cf9..f9ee0072573 100755 --- a/scripts/build-qemu.sh +++ b/scripts/build-qemu.sh @@ -21,20 +21,28 @@ usage() { fi echo "Usage: $0 -aBkrsw" echo
- echo " -a - Select architecture (arm, x86)"
- echo " -B - Don't build; assume a build exists"
- echo " -k - Use kvm (kernel-based Virtual Machine)"
- echo " -o - Run Operating System ('ubuntu' only for now)"
- echo " -r - Run QEMU with the image"
- echo " -R - Select OS release (e.g. 24.04)"
- echo " -s - Use serial only (no display)"
- echo " -w - Use word version (32-bit)" ) >&2
- echo " -a <arch> - Select architecture (arm, x86)"
How about qemu-riscv64_smode_defconfig for RISC-V?
- echo " -B - Don't build; assume a build exists"
- echo " -e - Run UEFI Self-Certification Test (SCT)"
- echo " -k - Use kvm (kernel-based Virtual Machine)"
- echo " -o <name> - Run Operating System ('ubuntu' only for now)"
- echo " -r - Run QEMU with the image"
- echo " -R <os> - Select OS release (e.g. 24.04)"
- echo " -s - Use serial only (no display)"
- echo " -S <seq> - Select SCT sequence-file"
- echo " -w - Use word version (32-bit)" ) >&2
A typical definition of word size is:
Word "size" refers to the amount of data a CPU's internal data registers can hold and process at one time.
I.e. a word on a 64-bit architecture has 64 bit.
%s/Use word version (32-bit)/Use 32-bit architecture/
Wouldn't it be the best to get rid of this parameter and just use parameter -a with values
- arm - arm64 - riscv64 - loongson64 - x86 - x86_64
exit 1 }
# Directory tree for OS images imagedir=${imagedir-/vid/software/linux}
+# Directory for UEFI Self-Certification Test (SCT) +sctdir=${sctdir-/vid/software/devel/uefi/sct}
+# Mount point for use when writing to disk images +mnt=${mnt-/mnt}
- # architecture (arm or x86) arch=arm
@@ -65,7 +73,7 @@ kvm= # We avoid in-tree build because it gets confusing trying different builds ubdir=${ubdir-/tmp/b}
-while getopts "a:Bko:rR:sw" opt; do +while getopts "a:Beko:rR:sS:w" opt; do case "${opt}" in a) arch=$OPTARG @@ -73,6 +81,17 @@ while getopts "a:Bko:rR:sw" opt; do B) build= ;;
- e)
extra+=" -m 4G -smp 4"
extra+=" -display none"
extra+=" -device virtio-gpu-pci"
extra+=" -device qemu-xhci"
extra+=" -device usb-kbd"
extra+=" -drive file=${sctdir}/sct.img,format=raw,if=none,id=vda"
extra+=" -device virtio-blk-device,drive=vda,bootindex=1"
extra+=" -device virtio-net-device,netdev=net0"
extra+=" -netdev user,id=net0"
k) kvm="-enable-kvm" ;;;;
@@ -91,6 +110,9 @@ while getopts "a:Bko:rR:sw" opt; do s) serial=1 ;;
- S)
seq=$OPTARG
w) bitness=32 ;;;;
@@ -105,6 +127,19 @@ build_u_boot() { buildman -w -o $DIR --board $BOARD -I || exit $? }
+# Write the SCT test-sequence file into the SCT image +update_sct_seq() {
- if [[ -z "${seq}" ]]; then
return
- fi
- LOOP=$(sudo losetup --show -f -P "${sctdir}/sct.img")
- PART="${LOOP}p1"
- sudo mount -o loop ${PART} ${mnt} -o uid=$(id -u),gid=$(id -g)
- cp "${seq}" "${mnt}/."
This will not work. The sequence file must be in Sequence directory of the installed SCT and you must specify the filename when invoking the SCT.
To avoid instance dependent file names you may copy the user provided sequence file always to the same location mnt/SCT/Sequence/uboot.seq.
Best regards
Heinrich
- sudo umount ${mnt}
- sudo losetup -d ${LOOP}
+}
- # Run QEMU with U-Boot run_qemu() { if [[ -n "${os_image}" ]]; then
@@ -129,7 +164,7 @@ arm) BOARD="qemu_arm" BIOS="u-boot.bin" qemu=qemu-system-arm
- extra+=" -machine virt"
- extra+=" -machine virt -accel tcg" suffix="arm" if [[ "${bitness}" == "64" ]]; then BOARD="qemu_arm64"
@@ -168,6 +203,7 @@ DIR=${ubdir}/${BOARD}
if [[ -n "${build}" ]]; then build_u_boot
update_sct_seq fi
if [[ -n "${run}" ]]; then

Hi Heinrich,
On Wed, 18 Dec 2024 at 05:09, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 11.12.24 01:46, Simon Glass wrote:
This is a feeble attempt to update the qemu script to run a selection of UEFI tests. It copies a .seq file into the disk so it can be read by SCT.
It doesn't seem to work and I am not sure why. I am posting it in case someone else has ideas or wants to pic it up.
Once Ilias' CI solution is in place, I can perhaps come back to this.
Signed-off-by: Simon Glass sjg@chromium.org
scripts/build-qemu.sh | 56 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-)
diff --git a/scripts/build-qemu.sh b/scripts/build-qemu.sh index 0ff53593cf9..f9ee0072573 100755 --- a/scripts/build-qemu.sh +++ b/scripts/build-qemu.sh @@ -21,20 +21,28 @@ usage() { fi echo "Usage: $0 -aBkrsw" echo
echo " -a - Select architecture (arm, x86)"
echo " -B - Don't build; assume a build exists"
echo " -k - Use kvm (kernel-based Virtual Machine)"
echo " -o - Run Operating System ('ubuntu' only for now)"
echo " -r - Run QEMU with the image"
echo " -R - Select OS release (e.g. 24.04)"
echo " -s - Use serial only (no display)"
echo " -w - Use word version (32-bit)" ) >&2
echo " -a <arch> - Select architecture (arm, x86)"
How about qemu-riscv64_smode_defconfig for RISC-V?
echo " -B - Don't build; assume a build exists"
echo " -e - Run UEFI Self-Certification Test (SCT)"
echo " -k - Use kvm (kernel-based Virtual Machine)"
echo " -o <name> - Run Operating System ('ubuntu' only for now)"
echo " -r - Run QEMU with the image"
echo " -R <os> - Select OS release (e.g. 24.04)"
echo " -s - Use serial only (no display)"
echo " -S <seq> - Select SCT sequence-file"
echo " -w - Use word version (32-bit)" ) >&2
A typical definition of word size is:
Word "size" refers to the amount of data a CPU's internal data registers can hold and process at one time.
I.e. a word on a 64-bit architecture has 64 bit.
%s/Use word version (32-bit)/Use 32-bit architecture/
Wouldn't it be the best to get rid of this parameter and just use parameter -a with values
- arm
- arm64
- riscv64
- loongson64
- x86
- x86_64
Yes, that might be better. My intent was to try to default to 64-bit, since that is what we normally want, but it isn't a very good flag. The efi script has the same thing.
On the other hand, it is annoying to say '64' when that is almost always what we mean. Perhaps a --32 flag?
exit 1
}
# Directory tree for OS images imagedir=${imagedir-/vid/software/linux}
+# Directory for UEFI Self-Certification Test (SCT) +sctdir=${sctdir-/vid/software/devel/uefi/sct}
+# Mount point for use when writing to disk images +mnt=${mnt-/mnt}
- # architecture (arm or x86) arch=arm
@@ -65,7 +73,7 @@ kvm= # We avoid in-tree build because it gets confusing trying different builds ubdir=${ubdir-/tmp/b}
-while getopts "a:Bko:rR:sw" opt; do +while getopts "a:Beko:rR:sS:w" opt; do case "${opt}" in a) arch=$OPTARG @@ -73,6 +81,17 @@ while getopts "a:Bko:rR:sw" opt; do B) build= ;;
e)
extra+=" -m 4G -smp 4"
extra+=" -display none"
extra+=" -device virtio-gpu-pci"
extra+=" -device qemu-xhci"
extra+=" -device usb-kbd"
extra+=" -drive file=${sctdir}/sct.img,format=raw,if=none,id=vda"
extra+=" -device virtio-blk-device,drive=vda,bootindex=1"
extra+=" -device virtio-net-device,netdev=net0"
extra+=" -netdev user,id=net0"
;; k) kvm="-enable-kvm" ;;
@@ -91,6 +110,9 @@ while getopts "a:Bko:rR:sw" opt; do s) serial=1 ;;
S)
seq=$OPTARG
;; w) bitness=32 ;;
@@ -105,6 +127,19 @@ build_u_boot() { buildman -w -o $DIR --board $BOARD -I || exit $? }
+# Write the SCT test-sequence file into the SCT image +update_sct_seq() {
if [[ -z "${seq}" ]]; then
return
fi
LOOP=$(sudo losetup --show -f -P "${sctdir}/sct.img")
PART="${LOOP}p1"
sudo mount -o loop ${PART} ${mnt} -o uid=$(id -u),gid=$(id -g)
cp "${seq}" "${mnt}/."
This will not work. The sequence file must be in Sequence directory of the installed SCT and you must specify the filename when invoking the SCT.
To avoid instance dependent file names you may copy the user provided sequence file always to the same location mnt/SCT/Sequence/uboot.seq.
OK, thanks, I'll take another look. It would be nice to get this working, although I believe Ilias will have a patch for CI before long.
Regards, Simon
participants (2)
-
Heinrich Schuchardt
-
Simon Glass