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        andb $0x3f,%bl
54        jnz mainloop
55
56        mov $66,%ax
57        mov $0x3f8,%dx
58        outb %al,%dx
59
60        jmp mainloop
61
62        # GDT magic from old (GPLv2)  Grub startup.S
63        .p2align        2       /* force 4-byte alignment */
64gdt:
65        .word   0, 0
66        .byte   0, 0, 0, 0
67
68        /* -- code segment --
69         * base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present
70         * type = 32bit code execute/read, DPL = 0
71         */
72        .word   0xFFFF, 0
73        .byte   0, 0x9A, 0xCF, 0
74
75        /* -- data segment --
76         * base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present
77         * type = 32 bit data read/write, DPL = 0
78         */
79        .word   0xFFFF, 0
80        .byte   0, 0x92, 0xCF, 0
81
82gdtdesc:
83        .word   0x27                    /* limit */
84        .long   gdt                     /* addr */
85
86/* I'm a bootable disk */
87.org 0x7dfe
88        .byte 0x55
89        .byte 0xAA
90