]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
multiboot and multiboot2 bootchecks
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 25 Aug 2010 18:34:07 +0000 (20:34 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 25 Aug 2010 18:34:07 +0000 (20:34 +0200)
Makefile.am
grub-core/tests/boot/multiboot.S [new file with mode: 0644]
grub-core/tests/boot/multiboot.cfg [new file with mode: 0644]
grub-core/tests/boot/multiboot2.cfg [new file with mode: 0644]

index 9988c40992273e50b1c42a8c5645933cc011f19b..f948a7a2ff71fcddacf39cba4d05e4601e554ff5 100644 (file)
@@ -126,6 +126,12 @@ linux.init.x86_64: $(srcdir)/grub-core/tests/boot/linux.init-x86_64.S
 linux.init.i386: $(srcdir)/grub-core/tests/boot/linux.init-i386.S
        $(TARGET_CC) -o $@ $< -m32 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\"
 
+multiboot.elf: $(srcdir)/grub-core/tests/boot/multiboot.S
+       $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include
+
+multiboot2.elf: $(srcdir)/grub-core/tests/boot/multiboot.S
+       $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include -DMULTIBOOT2=1
+
 kfreebsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kfreebsd.init-x86_64.S
        $(TARGET_CC) -o $@ $< -m64 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" && freebsd-brandelf -t FreeBSD $@
 
@@ -200,11 +206,19 @@ bootcheck-linux16-i386: linux-initramfs.i386 $(GRUB_PAYLOADS_DIR)/linux.i386 $(s
 bootcheck-linux16-x86_64: linux-initramfs.x86_64 $(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell
        timeout -s KILL $(BOOTCHECK_TIMEOUT) ./grub-shell --qemu-opts="$(GRUB_QEMU_OPTS)" --boot=$(BOOTTARGET) --qemu=qemu-system-x86_64 --files=/initrd=linux-initramfs.x86_64 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux16.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null
 
+bootcheck-multiboot: multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg grub-shell
+       timeout -s KILL $(BOOTCHECK_TIMEOUT) ./grub-shell --qemu-opts="$(GRUB_QEMU_OPTS)" --boot=$(BOOTTARGET) --qemu=$(QEMU32) --files=/multiboot.elf=multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null
+
+bootcheck-multiboot2: multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg grub-shell
+       timeout -s KILL $(BOOTCHECK_TIMEOUT) ./grub-shell --qemu-opts="$(GRUB_QEMU_OPTS)" --boot=$(BOOTTARGET) --qemu=$(QEMU32) --files=/multiboot2.elf=multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null
+
 BOOTCHECKS= 
 
+BOOTCHECKS += bootcheck-multiboot bootcheck-multiboot2
+
 BOOTCHECKS += bootcheck-linux16-i386 bootcheck-linux16-x86_64
 
-BOOTCHECKS += bootcheck-linux-i386 bootcheck-linux-x86_64 
+BOOTCHECKS += bootcheck-linux-i386 bootcheck-linux-x86_64
 
 # Crashes because memory at 0-0x1000 is occupied
 BOOTCHECKS += bootcheck-kfreebsd-i386 bootcheck-knetbsd-x86_64
diff --git a/grub-core/tests/boot/multiboot.S b/grub-core/tests/boot/multiboot.S
new file mode 100644 (file)
index 0000000..b9c0059
--- /dev/null
@@ -0,0 +1,89 @@
+#define ASM_FILE       1
+#ifdef MULTIBOOT2
+#include <multiboot2.h>
+#else
+#include <multiboot.h>
+#endif
+
+#define SHUTDOWN_PORT 0x8900
+
+       .text
+       /* Align 32 bits boundary.  */
+       .align  8
+
+#ifdef MULTIBOOT2
+       /* Multiboot header.  */
+multiboot_header:
+       /* magic */
+       .long   MULTIBOOT2_HEADER_MAGIC
+       /* ISA: i386 */
+       .long   MULTIBOOT_ARCHITECTURE_I386
+       /* Header length.  */
+       .long   multiboot_header_end - multiboot_header
+       /* checksum */
+       .long   -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
+       .short MULTIBOOT_HEADER_TAG_END
+       .short 0
+       .long 8
+multiboot_header_end:
+#else
+       /* Multiboot header.  */
+multiboot_header:
+       /* magic */
+       .long   MULTIBOOT_HEADER_MAGIC
+       /* flags */
+       .long   0
+       /* checksum */
+       .long   -MULTIBOOT_HEADER_MAGIC
+#endif
+       
+       .global start
+portmsg:
+       xorl %eax, %eax
+1:     
+       movb 0(%esi), %al
+       test %eax, %eax
+       jz 1f
+       outb %al, %dx
+       incl %esi
+       jmp 1b
+1:
+       ret
+
+serialmsg:     
+1:     
+       movb 0(%esi), %bl
+       testb %bl, %bl
+       jz 1f
+       movw $0x3fd, %dx
+2:     
+       inb %dx, %al
+       testb $0x20, %al
+       jz   2b
+
+       movw $0x3f8, %dx
+       movb %bl, %al
+       outb %al, %dx
+       incl %esi
+       jmp 1b
+1:
+       ret
+
+       .globl _start
+_start:
+       lea message, %esi
+       call serialmsg
+       lea shutdown, %esi
+       movw $SHUTDOWN_PORT, %dx
+       call portmsg
+
+1:
+       hlt
+       jmp 1b
+
+shutdown:
+       .ascii "Shutdown"
+       .byte 0
+message:
+       .ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n"
+       .byte 0
diff --git a/grub-core/tests/boot/multiboot.cfg b/grub-core/tests/boot/multiboot.cfg
new file mode 100644 (file)
index 0000000..0942ec6
--- /dev/null
@@ -0,0 +1,4 @@
+multiboot /multiboot.elf
+boot
+# Shouln't happen
+halt
diff --git a/grub-core/tests/boot/multiboot2.cfg b/grub-core/tests/boot/multiboot2.cfg
new file mode 100644 (file)
index 0000000..2bec9e6
--- /dev/null
@@ -0,0 +1,4 @@
+multiboot2 /multiboot2.elf
+boot
+# Shouln't happen
+halt