diff options
Diffstat (limited to 'tests/tcg/i386/system/boot.S')
-rw-r--r-- | tests/tcg/i386/system/boot.S | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/tests/tcg/i386/system/boot.S b/tests/tcg/i386/system/boot.S new file mode 100644 index 0000000000..90aa174908 --- /dev/null +++ b/tests/tcg/i386/system/boot.S @@ -0,0 +1,172 @@ +/* + * i386 boot code, based on qemu-bmibug. + * + * Copyright 2019 Doug Gale + * Copyright 2019 Linaro + * + * This work is licensed under the terms of the GNU GPL, version 3 or later. + * See the COPYING file in the top-level directory. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + + .section .head + + /* Multi-boot header */ +multiboot_st: + .int 0x1BADB002 + .int 0x10000 + .int -(0x10000+0x1BADB002) + // Load address + .int __load_st + .int __load_st + .int __load_en + .int __bss_en + .int _start + // mode + .int 0 + // width + .int 0 + // height + .int 0 + // depth + .int 0 + + .code32 + .section .text + + /* Kernel Entry Point */ +.global _start +_start: + // Setup stack ASAP + mov $stack_end,%esp + + // Load GDT ASAP + lgdt gdtr + ljmp $0x8,$.Lloadcs +.Lloadcs: + mov $0x10,%eax + mov %eax,%ds + mov %eax,%es + mov %eax,%fs + mov %eax,%gs + mov %eax,%ss + + // Fixup the IDT to the ridiculous i386 layout + xor %ebx,%ebx +.Lnextidt: + mov idt_00(,%ebx,8),%eax + shr $16,%eax + movw $0x8,idt_00+2(,%ebx,8) + movw $0x8E00,idt_00+4(,%ebx,8) + movw %ax,idt_00+6(,%ebx,8) + add $1,%ebx + cmp $32,%ebx + jl .Lnextidt + + // Load IDTR + push $idt_00 + push $((32 * 8 - 1) << 16) + lidt 2(%esp) + add $8,%esp + + /* + * Don't worry about stack frame, assume everthing + * is garbage when we return, we won't need it. + */ + call main + + /* output any non-zero result in eax to isa-debug-exit device */ + test %al, %al + jz 1f + out %ax, $0xf4 + +1: /* QEMU ACPI poweroff */ + mov $0x604,%edx + mov $0x2000,%eax + out %ax,%dx + hlt + jmp 1b + + /* + * Helper Functions + */ + + /* Output a single character to serial port */ + .global __sys_outc +__sys_outc: + pushl %ebp + movl %esp, %ebp + out %al,$0xE9 + movl %ebp, %esp + popl %ebp + ret + + + /* Interrupt Descriptor Table */ + + .section .data + .align 16 + +idt_00: .int 0, 0 +idt_01: .int 0, 0 +idt_02: .int 0, 0 +idt_03: .int 0, 0 +idt_04: .int 0, 0 +idt_05: .int 0, 0 +idt_06: .int 0, 0 /* intr_6_opcode, Invalid Opcode */ +idt_07: .int 0, 0 +idt_08: .int 0, 0 +idt_09: .int 0, 0 +idt_0A: .int 0, 0 +idt_0B: .int 0, 0 +idt_0C: .int 0, 0 +idt_0D: .int 0, 0 +idt_0E: .int 0, 0 +idt_0F: .int 0, 0 +idt_10: .int 0, 0 +idt_11: .int 0, 0 +idt_12: .int 0, 0 +idt_13: .int 0, 0 +idt_14: .int 0, 0 +idt_15: .int 0, 0 +idt_16: .int 0, 0 +idt_17: .int 0, 0 +idt_18: .int 0, 0 +idt_19: .int 0, 0 +idt_1A: .int 0, 0 +idt_1B: .int 0, 0 +idt_1C: .int 0, 0 +idt_1D: .int 0, 0 +idt_1E: .int 0, 0 +idt_1F: .int 0, 0 + +gdt: + .short 0 +gdtr: + .short gdt_en - gdt - 1 + .int gdt + + // Code + .short 0xFFFF + .short 0 + .byte 0 + .byte 0x9b + .byte 0xCF + .byte 0 + + // Data + .short 0xFFFF + .short 0 + .byte 0 + .byte 0x93 + .byte 0xCF + .byte 0 + +gdt_en: + + .section .bss + .align 16 + +stack: .space 65536 +stack_end: |