Tiago Pimenta
Tiago Pimenta

Reputation: 746

How to make simple bootloader for q35 machine

I'm following the babystep bootloader guide writing the code on GAS as suggested here when I run the image with qemu-system-x86_64 -machine type=pc,accel=kvm -drive 'format=raw,file=boot.bin' it works as expected, but I'd like to change the machine type to q35.

Here is my code:

.global _start
.code16
.text
_start:
        cli
        jmp .
.org 510
.word 0xaa55

Compiled with:

gcc \
  -Wl,--oformat=binary \
  -Wl,-Ttext=0x7c00 \
  -Wl,--build-id=none \
  -nostartfiles \
  -nostdlib \
  -m32 \
  -o boot.bin \
  boot.s

It's supposed to hang, with type=pc I have the following result: If you try to type Ctrl-Alt-Delete here nothing happens, that is the expected behavior.

And with type=q35 the following result:

How can I achieve the same result as on type=pc using type=q35?

P.S.: partial solution:

qemu-img create -f qcow2 -o lazy_refcounts=on disk.qcow2 16G
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 disk.qcow2
sudo dd if=boot.bin of=/dev/nbd0 status=progress
sudo qemu-nbd --disconnect /dev/nbd0
# ... -drive 'format=qcow2,l2-cache-size=2M,cache-clean-interval=900,file=disk.qcow2' ....

I'm not going to accept that yet until I understand why raw format is not working and if is really the only one possible way to fix that.

Upvotes: 3

Views: 315

Answers (1)

Tiago Pimenta
Tiago Pimenta

Reputation: 746

To fix that bug the image should have 515585 bytes or more, I don't know where this number comes from, I have tested several combinations until achieve this result, if you try one single byte less it doesn't work, but more bytes works fine.

truncate -s515585 boot.bin

Upvotes: 2

Related Questions