Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 338
Tiago Pimenta Avatar asked Jan 01 '26 07:01

Tiago Pimenta


1 Answers

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
like image 63
Tiago Pimenta Avatar answered Jan 04 '26 16:01

Tiago Pimenta



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!