2N/A#define ASM_FILE 1
2N/A#ifdef TARGET_MULTIBOOT2
2N/A#include <multiboot2.h>
2N/A#elif defined (TARGET_MULTIBOOT)
2N/A#include <multiboot.h>
2N/A#endif
2N/A
2N/A#define SHUTDOWN_PORT 0x8900
2N/A
2N/A .text
2N/A /* Align 32 bits boundary. */
2N/A .align 8
2N/A
2N/A#ifdef TARGET_MULTIBOOT2
2N/A /* Multiboot header. */
2N/Amultiboot_header:
2N/A /* magic */
2N/A .long MULTIBOOT2_HEADER_MAGIC
2N/A /* ISA: i386 */
2N/A .long MULTIBOOT_ARCHITECTURE_I386
2N/A /* Header length. */
2N/A .long multiboot_header_end - multiboot_header
2N/A /* checksum */
2N/A .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
2N/A .short MULTIBOOT_HEADER_TAG_END
2N/A .short 0
2N/A .long 8
2N/Amultiboot_header_end:
2N/A#elif defined (TARGET_MULTIBOOT)
2N/A /* Multiboot header. */
2N/Amultiboot_header:
2N/A /* magic */
2N/A .long MULTIBOOT_HEADER_MAGIC
2N/A /* flags */
2N/A .long 0
2N/A /* checksum */
2N/A .long -MULTIBOOT_HEADER_MAGIC
2N/A#endif
2N/A
2N/A .global start
2N/Aportmsg:
2N/A xorl %eax, %eax
2N/A1:
2N/A movb 0(%esi), %al
2N/A test %eax, %eax
2N/A jz 1f
2N/A outb %al, %dx
2N/A incl %esi
2N/A jmp 1b
2N/A1:
2N/A ret
2N/A
2N/Aserialmsg:
2N/A1:
2N/A movb 0(%esi), %bl
2N/A testb %bl, %bl
2N/A jz 1f
2N/A movw $0x3fd, %dx
2N/A2:
2N/A inb %dx, %al
2N/A testb $0x20, %al
2N/A jz 2b
2N/A
2N/A movw $0x3f8, %dx
2N/A movb %bl, %al
2N/A outb %al, %dx
2N/A incl %esi
2N/A jmp 1b
2N/A1:
2N/A ret
2N/A
2N/A .globl _start
2N/A_start:
2N/A lea message, %esi
2N/A call serialmsg
2N/A lea shutdown, %esi
2N/A movw $SHUTDOWN_PORT, %dx
2N/A call portmsg
2N/A
2N/A1:
2N/A hlt
2N/A jmp 1b
2N/A
2N/Ashutdown:
2N/A .ascii "Shutdown"
2N/A .byte 0
2N/Amessage:
2N/A .ascii "Boot Test Passed Successfully\n" SUCCESSFUL_BOOT_STRING "\n"
2N/A .byte 0