1# x86 bootblock used in migration test
2#  repeatedly increments the first byte of each page in a 100MB
3#  range.
4#  Outputs an initial 'A' on serial followed by repeated 'B's
5#
6# Copyright (c) 2016 Red Hat, Inc. and/or its affiliates
7# This work is licensed under the terms of the GNU GPL, version 2 or later.
8# See the COPYING file in the top-level directory.
9#
10# Author: dgilbert@redhat.com
11
12
13.code16
14.org 0x7c00
15        .file   "fill.s"
16        .text
17        .globl  start
18        .type   start, @function
19start:             # at 0x7c00 ?
20        cli
21        lgdt gdtdesc
22        mov $1,%eax
23        mov %eax,%cr0  # Protected mode enable
24        data32 ljmp $8,$0x7c20
25
26.org 0x7c20
27.code32
28        # A20 enable - not sure I actually need this
29        inb $0x92,%al
30        or  $2,%al
31        outb %al, $0x92
32
33        # set up DS for the whole of RAM (needed on KVM)
34        mov $16,%eax
35        mov %eax,%ds
36
37        mov $65,%ax
38        mov $0x3f8,%dx
39        outb %al,%dx
40
41        # bl keeps a counter so we limit the output speed
42        mov $0, %bl
43mainloop:
44        # Start from 1MB
45        mov $(1024*1024),%eax
46innerloop:
47        incb (%eax)
48        add $4096,%eax
49        cmp $(100*1024*1024),%eax
50        jl innerloop
51
52        inc %bl
53        jnz mainloop
54
55        mov $66,%ax
56        mov $0x3f8,%dx
57        outb %al,%dx
58
59        jmp mainloop
60
61        # GDT magic from old (GPLv2)  Grub startup.S
62        .p2align        2       /* force 4-byte alignment */
63gdt:
64        .word   0, 0
65        .byte   0, 0, 0, 0
66
67        /* -- code segment --
68         * base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present
69         * type = 32bit code execute/read, DPL = 0
70         */
71        .word   0xFFFF, 0
72        .byte   0, 0x9A, 0xCF, 0
73
74        /* -- data segment --
75         * base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present
76         * type = 32 bit data read/write, DPL = 0
77         */
78        .word   0xFFFF, 0
79        .byte   0, 0x92, 0xCF, 0
80
81gdtdesc:
82        .word   0x27                    /* limit */
83        .long   gdt                     /* addr */
84
85/* I'm a bootable disk */
86.org 0x7dfe
87        .byte 0x55
88        .byte 0xAA
89