qemu/tests/migration/i386/a-b-bootblock.S
<<
>>
Prefs
   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