diff --git a/DEVELOPERS b/DEVELOPERS
index 34effa6005..3f697e63ec 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2855,6 +2855,8 @@ F:	package/squashfs/
 F:	package/tinifier/
 F:	package/wayland/
 F:	package/weston/
+F:	support/testing/tests/boot/test_grub.py
+F:	support/testing/tests/boot/test_grub/
 F:	support/testing/tests/boot/test_syslinux.py
 F:	support/testing/tests/package/sample_python_augeas.py
 F:	support/testing/tests/package/sample_python_flask.py
diff --git a/support/testing/tests/boot/test_grub.py b/support/testing/tests/boot/test_grub.py
new file mode 100644
index 0000000000..33476f212e
--- /dev/null
+++ b/support/testing/tests/boot/test_grub.py
@@ -0,0 +1,153 @@
+import os
+
+import infra.basetest
+
+
+class TestGrubi386BIOS(infra.basetest.BRTest):
+    config = \
+        """
+        BR2_x86_core2=y
+        BR2_TOOLCHAIN_EXTERNAL=y
+        BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_X86_CORE2_UCLIBC_STABLE=y
+        BR2_ROOTFS_POST_BUILD_SCRIPT="board/pc/post-build.sh {}"
+        BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
+        BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/pc/genimage-bios.cfg"
+        BR2_LINUX_KERNEL=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.19.204"
+        BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+        BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/pc/linux.config"
+        BR2_LINUX_KERNEL_INSTALL_TARGET=y
+        BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+        BR2_TARGET_ROOTFS_EXT2=y
+        BR2_TARGET_GRUB2=y
+        BR2_TARGET_GRUB2_I386_PC=y
+        BR2_TARGET_GRUB2_INSTALL_TOOLS=y
+        BR2_PACKAGE_HOST_GENIMAGE=y
+        """.format(infra.filepath("tests/boot/test_grub/post-build.sh"))
+
+    def test_run(self):
+        hda = os.path.join(self.builddir, "images", "disk.img")
+        self.emulator.boot(arch="i386", options=["-hda", hda])
+        self.emulator.login()
+
+
+class TestGrubi386EFI(infra.basetest.BRTest):
+    config = \
+        """
+        BR2_x86_core2=y
+        BR2_TOOLCHAIN_EXTERNAL=y
+        BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_X86_CORE2_UCLIBC_STABLE=y
+        BR2_ROOTFS_POST_BUILD_SCRIPT="board/pc/post-build.sh {}"
+        BR2_ROOTFS_POST_IMAGE_SCRIPT="board/pc/post-image-efi.sh"
+        BR2_LINUX_KERNEL=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.19.204"
+        BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+        BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/pc/linux.config"
+        BR2_LINUX_KERNEL_INSTALL_TARGET=y
+        BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+        BR2_PACKAGE_EFIVAR=y
+        BR2_TARGET_ROOTFS_EXT2=y
+        BR2_TARGET_GRUB2=y
+        BR2_TARGET_GRUB2_I386_EFI=y
+        BR2_TARGET_GRUB2_INSTALL_TOOLS=y
+        BR2_TARGET_OVMF_BIN=y
+        BR2_PACKAGE_HOST_GENIMAGE=y
+        BR2_PACKAGE_HOST_MTOOLS=y
+        """.format(infra.filepath("tests/boot/test_grub/post-build.sh"))
+
+    def test_run(self):
+        hda = os.path.join(self.builddir, "images", "disk.img")
+        bios = os.path.join(self.builddir, "images", "RELEASEIa32_OVMF.fd")
+        self.emulator.boot(arch="i386", options=["-bios", bios, "-hda", hda])
+        self.emulator.login()
+
+        cmd = "modprobe efivarfs"
+        self.assertRunOk(cmd)
+
+        cmd = "mount -t efivarfs none /sys/firmware/efi/efivars"
+        self.assertRunOk(cmd)
+
+        cmd = "efivar -l"
+        self.assertRunOk(cmd)
+
+
+class TestGrubX8664EFI(infra.basetest.BRTest):
+    config = \
+        """
+        BR2_x86_64=y
+        BR2_x86_corei7=y
+        BR2_TOOLCHAIN_EXTERNAL=y
+        BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_X86_64_UCLIBC_STABLE=y
+        BR2_ROOTFS_POST_BUILD_SCRIPT="board/pc/post-build.sh {}"
+        BR2_ROOTFS_POST_IMAGE_SCRIPT="board/pc/post-image-efi.sh"
+        BR2_LINUX_KERNEL=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.19.204"
+        BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+        BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/pc/linux.config"
+        BR2_LINUX_KERNEL_INSTALL_TARGET=y
+        BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+        BR2_PACKAGE_EFIVAR=y
+        BR2_TARGET_ROOTFS_EXT2=y
+        BR2_TARGET_GRUB2=y
+        BR2_TARGET_GRUB2_X86_64_EFI=y
+        BR2_TARGET_GRUB2_INSTALL_TOOLS=y
+        BR2_TARGET_OVMF_BIN=y
+        BR2_PACKAGE_HOST_GENIMAGE=y
+        BR2_PACKAGE_HOST_MTOOLS=y
+        """.format(infra.filepath("tests/boot/test_grub/post-build.sh"))
+
+    def test_run(self):
+        hda = os.path.join(self.builddir, "images", "disk.img")
+        bios = os.path.join(self.builddir, "images", "RELEASEX64_OVMF.fd")
+        self.emulator.boot(arch="x86_64", options=["-bios", bios, "-hda", hda])
+        self.emulator.login()
+
+        cmd = "modprobe efivarfs"
+        self.assertRunOk(cmd)
+
+        cmd = "mount -t efivarfs none /sys/firmware/efi/efivars"
+        self.assertRunOk(cmd)
+
+        cmd = "efivar -l"
+        self.assertRunOk(cmd)
+
+
+class TestGrubAArch64EFI(infra.basetest.BRTest):
+    config = \
+        """
+        BR2_aarch64=y
+        BR2_TOOLCHAIN_EXTERNAL=y
+        BR2_ROOTFS_POST_IMAGE_SCRIPT="{post_image}"
+        BR2_LINUX_KERNEL=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION=y
+        BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.15.18"
+        BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+        BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux.config"
+        BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="{linux_fragment}"
+        BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+        BR2_PACKAGE_EFIVAR=y
+        BR2_TARGET_ROOTFS_EXT2=y
+        BR2_TARGET_GRUB2=y
+        BR2_TARGET_OVMF_BIN=y
+        BR2_PACKAGE_HOST_GENIMAGE=y
+        BR2_PACKAGE_HOST_MTOOLS=y
+        """.format(post_image=infra.filepath("tests/boot/test_grub/post-image-aarch64-efi.sh"),
+                   linux_fragment=infra.filepath("tests/boot/test_grub/linux-aarch64-efi.config"))
+
+    def test_run(self):
+        hda = os.path.join(self.builddir, "images", "disk.img")
+        bios = os.path.join(self.builddir, "images", "RELEASEAARCH64_QEMU_EFI.fd")
+        self.emulator.boot(arch="aarch64", options=["-M", "virt", "-cpu", "cortex-a53", "-bios", bios, "-hda", hda])
+        self.emulator.login()
+
+        cmd = "modprobe efivarfs"
+        self.assertRunOk(cmd)
+
+        cmd = "mount -t efivarfs none /sys/firmware/efi/efivars"
+        self.assertRunOk(cmd)
+
+        cmd = "efivar -l"
+        self.assertRunOk(cmd)
diff --git a/support/testing/tests/boot/test_grub/genimage-aarch64-efi.cfg b/support/testing/tests/boot/test_grub/genimage-aarch64-efi.cfg
new file mode 100644
index 0000000000..11615c885a
--- /dev/null
+++ b/support/testing/tests/boot/test_grub/genimage-aarch64-efi.cfg
@@ -0,0 +1,32 @@
+image efi-part.vfat {
+	vfat {
+		file EFI {
+			image = "efi-part/EFI"
+		}
+
+		file Image {
+			image = "Image"
+		}
+	}
+
+	size = 16352K # 16MB - 32KB
+}
+
+image disk.img {
+	hdimage {
+		partition-table-type = "gpt"
+	}
+
+	partition boot {
+		image = "efi-part.vfat"
+		partition-type-uuid = c12a7328-f81f-11d2-ba4b-00a0c93ec93b
+		offset = 32K
+		bootable = true
+	}
+
+	partition root {
+		partition-type-uuid = 44479540-f297-41b2-9af7-d131d5f0458a
+		partition-uuid = UUID_TMP
+		image = "rootfs.ext2"
+	}
+}
diff --git a/support/testing/tests/boot/test_grub/grub-aarch64-efi.cfg b/support/testing/tests/boot/test_grub/grub-aarch64-efi.cfg
new file mode 100644
index 0000000000..d40af0df24
--- /dev/null
+++ b/support/testing/tests/boot/test_grub/grub-aarch64-efi.cfg
@@ -0,0 +1,6 @@
+set default="0"
+set timeout="5"
+
+menuentry "Buildroot" {
+ linux /Image root=PARTUUID=UUID_TMP rootwait console=ttyAMA0
+}
diff --git a/support/testing/tests/boot/test_grub/linux-aarch64-efi.config b/support/testing/tests/boot/test_grub/linux-aarch64-efi.config
new file mode 100644
index 0000000000..839566bae0
--- /dev/null
+++ b/support/testing/tests/boot/test_grub/linux-aarch64-efi.config
@@ -0,0 +1 @@
+CONFIG_ACPI=y
diff --git a/support/testing/tests/boot/test_grub/post-build.sh b/support/testing/tests/boot/test_grub/post-build.sh
new file mode 100755
index 0000000000..8d6f0318de
--- /dev/null
+++ b/support/testing/tests/boot/test_grub/post-build.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+if [ -d "$BINARIES_DIR/efi-part/" ]; then
+    sed -i 's%tty1%ttyS0,115200%' "$BINARIES_DIR/efi-part/EFI/BOOT/grub.cfg"
+else
+    sed -i 's%tty1%ttyS0,115200%' "$TARGET_DIR/boot/grub/grub.cfg"
+fi
diff --git a/support/testing/tests/boot/test_grub/post-image-aarch64-efi.sh b/support/testing/tests/boot/test_grub/post-image-aarch64-efi.sh
new file mode 100755
index 0000000000..2db516ef2d
--- /dev/null
+++ b/support/testing/tests/boot/test_grub/post-image-aarch64-efi.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+set -e
+
+UUID=$(dumpe2fs "$BINARIES_DIR/rootfs.ext2" 2>/dev/null | sed -n 's/^Filesystem UUID: *\(.*\)/\1/p')
+sed "s/UUID_TMP/$UUID/g" support/testing/tests/boot/test_grub/grub-aarch64-efi.cfg > "$BINARIES_DIR/efi-part/EFI/BOOT/grub.cfg"
+sed "s/UUID_TMP/$UUID/g" support/testing/tests/boot/test_grub/genimage-aarch64-efi.cfg > "$BINARIES_DIR/genimage-aarch64-efi.cfg"
+support/scripts/genimage.sh -c "$BINARIES_DIR/genimage-aarch64-efi.cfg"
