Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

freebsd: Document how to build UEFI app on FreeBSD #52

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ cargo build -p framework_tool
ls -l target/debug/framework_tool

# Build the UEFI application
# Needs mtools installed via your OS package manager
# See in FreeBSD section for building on FreeBSD
# Can't be built with cargo! That's why we need to exclude it in the other commands.
make -C framework_uefi
ls -l framework_uefi/build/x86_64-unknown-uefi/boot.efi
Expand Down Expand Up @@ -311,3 +313,14 @@ cargo build --no-default-features --features freebsd
# Running the tool
cargo run --no-default-features --features freebsd
```

Build UEFI tool

```
# Build just tool
gmake -C framework_uefi build/x86_64-unknown-uefi/boot.efi

# Build QEMU image
# TODO: Does not work yet, need a replacement for GNU parted
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aokblast is there a scripted way to format a disk image on FreeBSD?
On Linux I used GNU parted.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, we have gpart which is the abbriviate of geom part that enable you to create and add partition. I found a post on stack exchange that have examples about this. Do I answer your question?

Copy link

@aokblast aokblast Aug 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, you are talking about image. We have mkimg which can be used as following pattern (stolen from my previous commit :) )

cfgdirname=$(mktemp -d /tmp/config.XXXXX)
cp ${BASEBITSDIR}/etc/bsdinstall.example ${cfgdirname}
makefs -D -B little -t msdos -o fat_type=16 -o volume_label=CONFIG -o create_size=16m ${2}.config ${cfgdirname}

mkimg -s mbr \
    -b ${BASEBITSDIR}/boot/mbr \
    -p efi:=${espfilename} \
    -p freebsd:-"mkimg -s bsd -b ${BASEBITSDIR}/boot/boot -p freebsd-ufs:=${2}.part" \
    -p fat16b:=${2}.config\

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh! That's cool. That looks super easy!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haven't tried, but might be as simple as this:

$(BUILD)/boot.img: $(BUILD)/boot.efi
  mkimg -s gpt \
    -p efi:=$<

But how can I use different make rules on FreeBSD 🤔

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the make rules you mentioned? Could you give me some detailed example?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, I forget some code segment. You have to create a partition image by mkfs than put file into it by directory. After that, you can use mkimg to create a full disk image. Here is a patch use this feature. You can take a release/amd64/make-memstick.sh as example. Hope I answered your question.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done! Now we just need to make sure it uses different commands on linux vs bsd

gmake -C framework_uefi MKFS=newfs_msdos
```
4 changes: 3 additions & 1 deletion framework_uefi/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ BUILD=build/$(TARGET)

SRC_DIR=.

MKFS=mkfs.vfat

QEMU?=qemu-system-x86_64
QEMU_FLAGS=\
-M q35 \
Expand Down Expand Up @@ -33,7 +35,7 @@ $(BUILD)/boot.img: $(BUILD)/efi.img
# Create filesystem with updater (bootx64.efi)
$(BUILD)/efi.img: $(BUILD)/boot.efi
dd if=/dev/zero [email protected] bs=512 count=98304
mkfs.vfat [email protected]
$(MKFS) [email protected]
mmd -i [email protected] efi
mmd -i [email protected] efi/boot
mcopy -i [email protected] $< ::efi/boot/bootx64.efi
Expand Down