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