diff options
Diffstat (limited to 'grub-core/tests')
24 files changed, 1115 insertions, 0 deletions
| diff --git a/grub-core/tests/boot/kbsd.init-i386.S b/grub-core/tests/boot/kbsd.init-i386.S new file mode 100644 index 0000000..7011c79 --- /dev/null +++ b/grub-core/tests/boot/kbsd.init-i386.S @@ -0,0 +1,125 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifdef TARGET_NETBSD +#define SYSCALL_RESET 208 +#elif defined (TARGET_OPENBSD) +#define SYSCALL_RESET 55 +#else +#error unknown target +#endif + +#define MODE_RDRW 2 +#define FLAGS_NONE 0 +#define SYSCALL_OPEN 5 +#define SYSCALL_WRITE 4 +#define SYSCALL_EXIT 1 +#define SYSCALL_ARCH 165 +#define SYSCALL_INT 0x80 +#define SYSCALL_ARCH_IOPL	2 + +#define RESET_NOSYNC 0x4 +#define RESET_HALT 0x8 +#define RESET_POWEROFF 0x800 + +#define SHUTDOWN_PORT 0x8900 + +	.section ".init", "ax" +	.global start,_start +start: +_start: +	/* open.  */ +	movl $SYSCALL_OPEN, %eax +	pushl $FLAGS_NONE +	pushl $MODE_RDRW +	leal device, %ebx +	pushl %ebx +	pushl $0 +	int $SYSCALL_INT +	addl $16, %esp +	movl %eax, %ecx + +	/* write.  */ +	movl $SYSCALL_WRITE, %eax +	pushl $(messageend-message) +	leal message, %ebx +	pushl %ebx +	pushl %ecx +	pushl $0 +	int $SYSCALL_INT +	addl $16, %esp + +	/* IOPL.  */ +	movl $SYSCALL_ARCH, %eax +	pushl $iopl_arg +	pushl $SYSCALL_ARCH_IOPL +	pushl $0 +	int $SYSCALL_INT +	addl $12, %esp + +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx + +	/* shutdown.  */ +	movl $SYSCALL_RESET, %eax +	pushl $0 +	pushl $(RESET_POWEROFF|RESET_HALT|RESET_NOSYNC) +	pushl $0 +	int $SYSCALL_INT +	addl $8, %esp + +	/* exit (1). Shouldn't be reached.  */ +	movl $SYSCALL_EXIT, %eax +	pushl $1 +	pushl $0 +	int $SYSCALL_INT +	.section ".fini", "ax" +1:	jmp 1b +	.section ".text", "ax" +1:	jmp 1b +	/* This section is needed for NetBSD to identify the binary.  */ +	.section ".note.netbsd.ident", "a" +	.long 0x7 +	.long 0x4 +	.long 0x1 +	.ascii "NetBSD" +	.byte 0 +	.data +device: +	.ascii "/dev/console" +	.byte 0 +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: +iopl_arg: +	.long 3 diff --git a/grub-core/tests/boot/kbsd.init-x86_64.S b/grub-core/tests/boot/kbsd.init-x86_64.S new file mode 100644 index 0000000..81f810e --- /dev/null +++ b/grub-core/tests/boot/kbsd.init-x86_64.S @@ -0,0 +1,111 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#define MODE_RDRW 2 +#define FLAGS_NONE 0 +#define SYSCALL_OPEN 5 +#define SYSCALL_WRITE 4 +#ifdef TARGET_NETBSD +#define SYSCALL_RESET 208 +#elif defined (TARGET_OPENBSD) +#define SYSCALL_RESET 55 +#else +#error unknown target +#endif +#define SYSCALL_EXIT 1 +#define SYSCALL_ARCH 165 +#define SYSCALL_INT 0x80 +#define SYSCALL_ARCH_IOPL	2 + +#define RESET_NOSYNC 0x4 +#define RESET_HALT 0x8 +#define RESET_POWEROFF 0x800 +#define SHUTDOWN_PORT 0x8900 + +	.section ".init", "ax" +	.global start,_start +start: +_start: +	/* open.  */ +	movq $SYSCALL_OPEN, %rax +	leaq device, %rdi +	movq $MODE_RDRW, %rsi +	movq $FLAGS_NONE, %rdx +	syscall +	movq %rax, %rdi + +	/* write.  */ +	movq $SYSCALL_WRITE, %rax +	movq $(messageend-message), %rdx +	leaq message, %rsi +	syscall + +	/* IOPL.  */ +	movq $SYSCALL_ARCH, %rax +	movq $SYSCALL_ARCH_IOPL, %rdi +	leaq iopl_arg, %rsi +	syscall + +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx + +	/* shutdown.  */ +	movq $SYSCALL_RESET, %rax +	movq $(RESET_POWEROFF|RESET_HALT|RESET_NOSYNC), %rdi +	movq $0, %rsi +	syscall + +	/* exit (1). Shouldn't be reached.  */ +	movq $SYSCALL_EXIT, %rax +	movq $1, %rdi +	syscall +	.section ".fini", "ax" +1:	jmp 1b +	.section ".text", "ax" +1:	jmp 1b +	/* This section is needed for NetBSD to identify the binary.  */ +	.section ".note.netbsd.ident", "a" +	.long 0x7 +	.long 0x4 +	.long 0x1 +	.ascii "NetBSD" +	.byte 0 +	.data +device: +	.ascii "/dev/console" +	.byte 0 +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: +iopl_arg: +	.long 3 diff --git a/grub-core/tests/boot/kbsd.spec.txt b/grub-core/tests/boot/kbsd.spec.txt new file mode 100644 index 0000000..af171bc --- /dev/null +++ b/grub-core/tests/boot/kbsd.spec.txt @@ -0,0 +1,3 @@ +. type=dir +	dev type=dir +		console type=char device=0 mode=666 gid=0 uid=0 diff --git a/grub-core/tests/boot/kernel-8086.S b/grub-core/tests/boot/kernel-8086.S new file mode 100644 index 0000000..20040da --- /dev/null +++ b/grub-core/tests/boot/kernel-8086.S @@ -0,0 +1,69 @@ + +#define SHUTDOWN_PORT 0x8900 + +	.text +	.globl _start +_start: +base:	 +	.code16 +	jmp cont + +portmsg: +	xorw %ax, %ax +1:	 +	movb 0(%si), %al +	test %ax, %ax +	jz 1f +	outb %al, %dx +	incw %si +	jmp 1b +1: +	ret + +serialmsg:	 +1:	 +	movb 0(%si), %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 +	incw %si +	jmp 1b +1: +	ret + +cont: +#ifdef TARGET_NTLDR +	movw $0x2000, %ax +#elif defined (TARGET_CHAINLOADER) +	xorw %ax, %ax +#else +#error unsupported target +#endif +	movw %ax, %ds +	lea message, %si +	call serialmsg +	lea shutdown, %si +	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 + +	. = base + 510 +	.short 0xaa55
\ No newline at end of file diff --git a/grub-core/tests/boot/kernel-i386.S b/grub-core/tests/boot/kernel-i386.S new file mode 100644 index 0000000..904b0d4 --- /dev/null +++ b/grub-core/tests/boot/kernel-i386.S @@ -0,0 +1,89 @@ +#define ASM_FILE	1 +#ifdef TARGET_MULTIBOOT2 +#include <multiboot2.h> +#elif defined (TARGET_MULTIBOOT) +#include <multiboot.h> +#endif + +#define SHUTDOWN_PORT 0x8900 + +	.text +	/* Align 32 bits boundary.  */ +	.align	8 + +#ifdef TARGET_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: +#elif defined (TARGET_MULTIBOOT) +	/* 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/kfreebsd-aout.cfg b/grub-core/tests/boot/kfreebsd-aout.cfg new file mode 100644 index 0000000..31e34b4 --- /dev/null +++ b/grub-core/tests/boot/kfreebsd-aout.cfg @@ -0,0 +1,4 @@ +kfreebsd /kfreebsd.aout +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/kfreebsd.cfg b/grub-core/tests/boot/kfreebsd.cfg new file mode 100644 index 0000000..f28ee79 --- /dev/null +++ b/grub-core/tests/boot/kfreebsd.cfg @@ -0,0 +1,8 @@ +kfreebsd /kfreebsd -hv +kfreebsd_loadenv /kfreebsd_env +kfreebsd_module /mfsroot.gz type=mfs_root +set kFreeBSD.hw.hasbrokenint12=1 +fakebios +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/kfreebsd.init-i386.S b/grub-core/tests/boot/kfreebsd.init-i386.S new file mode 100644 index 0000000..12c94a0 --- /dev/null +++ b/grub-core/tests/boot/kfreebsd.init-i386.S @@ -0,0 +1,114 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#define MODE_RDRW 2 +#define FLAGS_NONE 0 +#define SYSCALL_OPEN 5 +#define SYSCALL_WRITE 4 +#define SYSCALL_RESET 55 +#define SYSCALL_FSYNC 95 +#define SYSCALL_ARCH 165 +#define SYSCALL_EXIT 1 +#define SYSCALL_ARCH_IOPL	4 +#define SYSCALL_INT 0x80 + +#define RESET_NOSYNC 0x4 +#define RESET_HALT 0x8 +#define RESET_POWEROFF 0x4000 +#define SHUTDOWN_PORT 0x8900 + +	.section ".init", "ax" +	.global start,_start +start: +_start: +	/* open.  */ +	movl $SYSCALL_OPEN, %eax +	pushl $FLAGS_NONE +	pushl $MODE_RDRW +	leal device, %ebx +	pushl %ebx +	pushl $0 +	int $SYSCALL_INT +	addl $16, %esp +	movl %eax, %ecx + +	/* write.  */ +	movl $SYSCALL_WRITE, %eax +	pushl $(messageend-message) +	leal message, %ebx +	pushl %ebx +	pushl %ecx +	pushl $0 +	int $SYSCALL_INT +	addl $16, %esp + +	/* fsync.  */ +	movl $SYSCALL_FSYNC, %eax +	pushl %ecx +	pushl $0 +	int $SYSCALL_INT +	addl $8, %esp + +	/* IOPL.  */ +	movl $SYSCALL_ARCH, %eax +	pushl $iopl_arg +	pushl $SYSCALL_ARCH_IOPL +	pushl $0 +	int $SYSCALL_INT +	addl $12, %esp +	 +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx +	 +	/* shutdown.  */ +	movl $SYSCALL_RESET, %eax +	pushl $(RESET_POWEROFF|RESET_HALT|RESET_NOSYNC) +	pushl $0 +	int $SYSCALL_INT +	addl $8, %esp + +	/* exit (1). Shouldn't be reached.  */ +	movl $SYSCALL_EXIT, %eax +	pushl $1 +	pushl $0 +	int $SYSCALL_INT +device: +	.ascii "/dev/console" +	.byte 0 +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: +iopl_arg: +	.long SHUTDOWN_PORT +	.long 1 +	.long 1 diff --git a/grub-core/tests/boot/kfreebsd.init-x86_64.S b/grub-core/tests/boot/kfreebsd.init-x86_64.S new file mode 100644 index 0000000..0a9ff51 --- /dev/null +++ b/grub-core/tests/boot/kfreebsd.init-x86_64.S @@ -0,0 +1,98 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#define MODE_RDRW 2 +#define FLAGS_NONE 0 +#define SYSCALL_ARCH 165 +#define SYSCALL_OPEN 5 +#define SYSCALL_WRITE 4 +#define SYSCALL_RESET 55 +#define SYSCALL_EXIT 1 +#define SYSCALL_ARCH_IOPL	4 +#define SYSCALL_FSYNC 95 + +#define RESET_NOSYNC 0x4 +#define RESET_HALT 0x8 +#define RESET_POWEROFF 0x4000 +#define SHUTDOWN_PORT 0x8900 + +	.section ".init", "ax" +	.global start,_start +start: +_start: +	/* open.  */ +	movq $SYSCALL_OPEN, %rax +	leaq device, %rdi +	movq $MODE_RDRW, %rsi +	movq $FLAGS_NONE, %rdx +	syscall +	movq %rax, %rdi + +	/* write.  */ +	leaq message, %rsi +	movq $SYSCALL_WRITE, %rax +	movq $(messageend - message), %rdx +	syscall + +	/* fsync.  */ +	movq $SYSCALL_FSYNC, %rax +	syscall + +	/* IOPL.  */ +	movq $SYSCALL_ARCH, %rax +	movq $SYSCALL_ARCH_IOPL, %rdi +	leaq iopl_arg, %rsi +	syscall + +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx +	 +	/* shutdown.  */ +	movq $SYSCALL_RESET, %rax +	movq $(RESET_POWEROFF|RESET_HALT|RESET_NOSYNC), %rdi +	syscall + +	/* exit (1). Shouldn't be reached.  */ +	movq $SYSCALL_EXIT, %rax +	movq $1, %rdi +	syscall +device: +	.ascii "/dev/console" +	.byte 0 +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: +iopl_arg: +	.long SHUTDOWN_PORT +	.long 1 +	.long 1 diff --git a/grub-core/tests/boot/knetbsd.cfg b/grub-core/tests/boot/knetbsd.cfg new file mode 100644 index 0000000..f88a846 --- /dev/null +++ b/grub-core/tests/boot/knetbsd.cfg @@ -0,0 +1,5 @@ +knetbsd /knetbsd -h +knetbsd_module_elf /miniroot.gz +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/kopenbsd.cfg b/grub-core/tests/boot/kopenbsd.cfg new file mode 100644 index 0000000..132bec4 --- /dev/null +++ b/grub-core/tests/boot/kopenbsd.cfg @@ -0,0 +1,5 @@ +kopenbsd /kopenbsd -h +kopenbsd_ramdisk /ramdisk +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/kopenbsdlabel.txt b/grub-core/tests/boot/kopenbsdlabel.txt new file mode 100644 index 0000000..bb14113 --- /dev/null +++ b/grub-core/tests/boot/kopenbsdlabel.txt @@ -0,0 +1,3 @@ +#        size   offset    fstype   [fsize bsize bps/cpg] +  a:      256        0    4.2BSD        0     0     1  +  c:      256        0    unused        0     0         # "raw" part, don't edit diff --git a/grub-core/tests/boot/linux.cfg b/grub-core/tests/boot/linux.cfg new file mode 100644 index 0000000..f5bf6ac --- /dev/null +++ b/grub-core/tests/boot/linux.cfg @@ -0,0 +1,5 @@ +linux /linux console=ttyS0 root=/dev/ram0 +initrd /initrd +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/linux.init-i386.S b/grub-core/tests/boot/linux.init-i386.S new file mode 100644 index 0000000..5b0088e --- /dev/null +++ b/grub-core/tests/boot/linux.init-i386.S @@ -0,0 +1,79 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#define SYSCALL_WRITE 4 +#define SYSCALL_RESET 88 +#define SYSCALL_IOPL 110 +#define SYSCALL_EXIT 1 +#define SYSCALL_INT 0x80 + +#define STDOUT 1 +#define SHUTDOWN_MAGIC1 0xfee1dead +#define SHUTDOWN_MAGIC2 0x28121969 +#define SHUTDOWN_MAGIC3 0x4321fedc + +#define SHUTDOWN_PORT 0x8900 + +	.text +	.global start, _start +_start: +start: +	/* write.  */ +	movl $SYSCALL_WRITE, %eax +	movl $STDOUT, %ebx +	leal message, %ecx +	movl $(messageend-message), %edx +	int $SYSCALL_INT + +	movl $SYSCALL_IOPL, %eax +	movl $3, %ebx +	int $SYSCALL_INT + +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx +	 +	/* shutdown.  */ +	movl $SYSCALL_RESET, %eax +	movl $SHUTDOWN_MAGIC1, %ebx +	movl $SHUTDOWN_MAGIC2, %ecx +	movl $SHUTDOWN_MAGIC3, %edx +	int $SYSCALL_INT + +	/* exit (1). Shouldn't be reached.  */ +	movl $SYSCALL_EXIT, %eax +	movl $1, %ebx +	int $SYSCALL_INT +	.data +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: diff --git a/grub-core/tests/boot/linux.init-x86_64.S b/grub-core/tests/boot/linux.init-x86_64.S new file mode 100644 index 0000000..fc32dfd --- /dev/null +++ b/grub-core/tests/boot/linux.init-x86_64.S @@ -0,0 +1,78 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#define SYSCALL_WRITE 1 +#define SYSCALL_RESET 169 +#define SYSCALL_IOPL 172 +#define SYSCALL_EXIT 60 + +#define STDOUT 1 +#define SHUTDOWN_MAGIC1 0xfee1dead +#define SHUTDOWN_MAGIC2 0x28121969 +#define SHUTDOWN_MAGIC3 0x4321fedc + +#define SHUTDOWN_PORT 0x8900 + +	.text +	.global start, _start +_start: +start: +	/* write.  */ +	movq $SYSCALL_WRITE, %rax +	movq $STDOUT, %rdi +	leaq message, %rsi +	movq $(messageend-message), %rdx +	syscall + +	movq $SYSCALL_IOPL, %rax +	movq $3, %rdi +	syscall + +	movw $SHUTDOWN_PORT, %dx +	movb $'S', %al +	outb %al, %dx +	movb $'h', %al +	outb %al, %dx +	movb $'u', %al +	outb %al, %dx +	movb $'t', %al +	outb %al, %dx +	movb $'d', %al +	outb %al, %dx +	movb $'o', %al +	outb %al, %dx +	movb $'w', %al +	outb %al, %dx +	movb $'n', %al +	outb %al, %dx +	 +	/* shutdown.  */ +	movq $SYSCALL_RESET, %rax +	movq $SHUTDOWN_MAGIC1, %rdi +	movq $SHUTDOWN_MAGIC2, %rsi +	movq $SHUTDOWN_MAGIC3, %rdx +	syscall + +	/* exit(1). Shouldn't be reached.  */ +	movq $SYSCALL_EXIT, %rax +	movq $1, %rdi +	syscall +	.data +message: +	.ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n" +messageend: diff --git a/grub-core/tests/boot/linux16.cfg b/grub-core/tests/boot/linux16.cfg new file mode 100644 index 0000000..d7fbf96 --- /dev/null +++ b/grub-core/tests/boot/linux16.cfg @@ -0,0 +1,5 @@ +linux16 /linux console=ttyS0 root=/dev/ram0 +initrd16 /initrd +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/multiboot.cfg b/grub-core/tests/boot/multiboot.cfg new file mode 100644 index 0000000..0942ec6 --- /dev/null +++ b/grub-core/tests/boot/multiboot.cfg @@ -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 index 0000000..2bec9e6 --- /dev/null +++ b/grub-core/tests/boot/multiboot2.cfg @@ -0,0 +1,4 @@ +multiboot2 /multiboot2.elf +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/ntldr.cfg b/grub-core/tests/boot/ntldr.cfg new file mode 100644 index 0000000..cd438a4 --- /dev/null +++ b/grub-core/tests/boot/ntldr.cfg @@ -0,0 +1,4 @@ +ntldr /ntldr.bin +boot +# Shouln't happen +halt diff --git a/grub-core/tests/boot/pc-chainloader.cfg b/grub-core/tests/boot/pc-chainloader.cfg new file mode 100644 index 0000000..1e80a5b --- /dev/null +++ b/grub-core/tests/boot/pc-chainloader.cfg @@ -0,0 +1,4 @@ +chainloader /pc-chainloader.bin +boot +# Shouln't happen +halt diff --git a/grub-core/tests/example_functional_test.c b/grub-core/tests/example_functional_test.c new file mode 100644 index 0000000..8020887 --- /dev/null +++ b/grub-core/tests/example_functional_test.c @@ -0,0 +1,38 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010 Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* All tests need to include test.h for GRUB testing framework.  */ +#include <grub/test.h> +#include <grub/dl.h> + +GRUB_MOD_LICENSE ("GPLv3+"); + +/* Functional test main method.  */ +static void +example_test (void) +{ +  /* Check if 1st argument is true and report with default error message.  */ +  grub_test_assert (1 == 1); + +  /* Check if 1st argument is true and report with custom error message.  */ +  grub_test_assert (2 == 2, "2 equal 2 expected"); +  grub_test_assert (2 != 3, "2 matches %d", 3); +} + +/* Register example_test method as a functional test.  */ +GRUB_FUNCTIONAL_TEST (example_functional_test, example_test); diff --git a/grub-core/tests/lib/functional_test.c b/grub-core/tests/lib/functional_test.c new file mode 100644 index 0000000..fd199bd --- /dev/null +++ b/grub-core/tests/lib/functional_test.c @@ -0,0 +1,50 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010 Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <grub/mm.h> +#include <grub/misc.h> +#include <grub/extcmd.h> +#include <grub/test.h> +#include <grub/dl.h> + +GRUB_MOD_LICENSE ("GPLv3+"); + +static grub_err_t +grub_functional_test (grub_extcmd_context_t ctxt __attribute__ ((unused)), +		      int argc __attribute__ ((unused)), +		      char **args __attribute__ ((unused))) +{ +  grub_test_t test; + +  FOR_LIST_ELEMENTS (test, grub_test_list) +    grub_test_run (test); +  return GRUB_ERR_NONE; +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT (functional_test) +{ +  cmd = grub_register_extcmd ("functional_test", grub_functional_test, 0, 0, +			      "Run all functional tests.", 0); +} + +GRUB_MOD_FINI (functional_test) +{ +  grub_unregister_extcmd (cmd); +} diff --git a/grub-core/tests/lib/test.c b/grub-core/tests/lib/test.c new file mode 100644 index 0000000..06d78b7 --- /dev/null +++ b/grub-core/tests/lib/test.c @@ -0,0 +1,157 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010 Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <grub/mm.h> +#include <grub/misc.h> +#include <grub/test.h> + +struct grub_test_failure +{ +  /* The next failure.  */ +  struct grub_test_failure *next; + +  /* The test source file name.  */ +  char *file; + +  /* The test function name.  */ +  char *funp; + +  /* The test call line number.  */ +  grub_uint32_t line; + +  /* The test failure message.  */ +  char *message; +}; +typedef struct grub_test_failure *grub_test_failure_t; + +grub_test_t grub_test_list; +static grub_test_failure_t failure_list; + +static void +add_failure (const char *file, +	     const char *funp, +	     grub_uint32_t line, const char *fmt, va_list args) +{ +  grub_test_failure_t failure; + +  failure = (grub_test_failure_t) grub_malloc (sizeof (*failure)); +  if (!failure) +    return; + +  failure->file = grub_strdup (file ? : "<unknown_file>"); +  failure->funp = grub_strdup (funp ? : "<unknown_function>"); +  failure->line = line; +  failure->message = grub_xvasprintf (fmt, args); + +  grub_list_push (GRUB_AS_LIST_P (&failure_list), GRUB_AS_LIST (failure)); +} + +static void +free_failures (void) +{ +  grub_test_failure_t item; + +  while (failure_list) +    { +      item = failure_list; +      failure_list = item->next; +      if (item->message) +	grub_free (item->message); + +      if (item->funp) +	grub_free (item->funp); + +      if (item->file) +	grub_free (item->file); + +      grub_free (item); +    } +  failure_list = 0; +} + +void +grub_test_nonzero (int cond, +		   const char *file, +		   const char *funp, grub_uint32_t line, const char *fmt, ...) +{ +  va_list ap; + +  if (cond) +    return; + +  va_start (ap, fmt); +  add_failure (file, funp, line, fmt, ap); +  va_end (ap); +} + +void +grub_test_register (const char *name, void (*test_main) (void)) +{ +  grub_test_t test; + +  test = (grub_test_t) grub_malloc (sizeof (*test)); +  if (!test) +    return; + +  test->name = grub_strdup (name); +  test->main = test_main; + +  grub_list_push (GRUB_AS_LIST_P (&grub_test_list), GRUB_AS_LIST (test)); +} + +void +grub_test_unregister (const char *name) +{ +  grub_test_t test; + +  test = (grub_test_t) grub_named_list_find +    (GRUB_AS_NAMED_LIST (grub_test_list), name); + +  if (test) +    { +      grub_list_remove (GRUB_AS_LIST_P (&grub_test_list), GRUB_AS_LIST (test)); + +      if (test->name) +	grub_free (test->name); + +      grub_free (test); +    } +} + +int +grub_test_run (grub_test_t test) +{ +  grub_test_failure_t failure; + +  test->main (); + +  grub_printf ("%s:\n", test->name); +  FOR_LIST_ELEMENTS (failure, failure_list) +    grub_printf (" %s:%s:%u: %s\n", +		 (failure->file ? : "<unknown_file>"), +		 (failure->funp ? : "<unknown_function>"), +		 failure->line, (failure->message ? : "<no message>")); + +  if (!failure_list) +    grub_printf ("%s: PASS\n", test->name); +  else +    grub_printf ("%s: FAIL\n", test->name); + +  free_failures (); +  return GRUB_ERR_NONE; +} diff --git a/grub-core/tests/test_blockarg.c b/grub-core/tests/test_blockarg.c new file mode 100644 index 0000000..ddd46e1 --- /dev/null +++ b/grub-core/tests/test_blockarg.c @@ -0,0 +1,53 @@ +/* test_blockarg.c - print and execute block argument  */ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 2010  Free Software Foundation, Inc. + * + *  GRUB is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  GRUB is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <grub/dl.h> +#include <grub/err.h> +#include <grub/misc.h> +#include <grub/i18n.h> +#include <grub/extcmd.h> +#include <grub/script_sh.h> + +GRUB_MOD_LICENSE ("GPLv3+"); + +static grub_err_t +test_blockarg (grub_extcmd_context_t ctxt, int argc, char **args) +{ +  if (! ctxt->script) +    return grub_error (GRUB_ERR_BAD_ARGUMENT, "no block parameter"); + +  grub_printf ("%s\n", args[argc - 1]); +  grub_script_execute (ctxt->script); +  return GRUB_ERR_NONE; +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(test_blockarg) +{ +  cmd = grub_register_extcmd ("test_blockarg", test_blockarg, +			      GRUB_COMMAND_FLAG_BLOCKS, +			      N_("BLOCK"), +			      N_("Print and execute block argument."), 0); +} + +GRUB_MOD_FINI(test_blockarg) +{ +  grub_unregister_extcmd (cmd); +} | 
