a-b-bootblock.S (2189B)
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 19 start: # 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 43 mainloop: 44 # Start from 1MB 45 mov $(1024*1024),%eax 46 innerloop: 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 */ 64 gdt: 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 82 gdtdesc: 83 .word 0x27 /* limit */ 84 .long gdt /* addr */ 85 86 /* I'm a bootable disk */ 87 .org 0x7dfe 88 .byte 0x55 89 .byte 0xAA