From df22bcc17f8d1159ba05c0d0a7da933676648c1d Mon Sep 17 00:00:00 2001 From: mintsuki Date: Tue, 7 Apr 2020 07:24:19 +0200 Subject: [PATCH] Add readme and prebuilt image --- .gitignore | 1 + README.md | 35 +++++++++++++++++++++++++++++++++++ qloader2-install | 10 ++++++---- qloader2.bin | Bin 0 -> 32768 bytes 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 qloader2.bin diff --git a/.gitignore b/.gitignore index d363c0ae..b0018fe9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /**/*.img /bochsout.txt /bx_enh_dbg.ini +!/qloader2.bin diff --git a/README.md b/README.md index 5b06fdb8..6fe8a5df 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,37 @@ # qloader2 x86/x86_64 BIOS Bootloader + +## How to use +This repository contains a prebuilt version of qloader2 so building it won't +be necessary. + +In order to install qloader2 on a device (which can just be a raw image file), +run the provided `qloader2-install` script as such: + +```bash +./qloader2-install ./qloader2.bin +``` + +Then make sure the device/image contains at least 1 partition formatted in +echfs containing a `qloader2.cfg` file and the kernel/modules one wants to load. + +An example `qloader2.cfg` file can be found in `test/qloader2.cfg`. + +For example, to create an empty image file of 64MiB in size, 1 echfs partition +on the image spanning the whole device, format it, copy the relevant files over, +and install qloader2, one can do: + +```bash +dd if=/dev/zero bs=1M count=0 seek=64 of=test.img +parted -s test.img mklabel msdos +parted -s test.img mkpart primary 1 100% +echfs-utils -m -p0 test.img quick-format 32768 +echfs-utils -m -p0 test.img import path/to/qloader2.cfg qloader2.cfg +echfs-utils -m -p0 test.img import path/to/kernel.elf kernel.elf +echfs-utils -m -p0 test.img import +... +./qloader2-install $THIS_REPO/qloader2.bin test.img + +``` + +One can get `echfs-utils` by installing https://github.com/qword-os/echfs. diff --git a/qloader2-install b/qloader2-install index 6c8ec6d8..c3ca44bf 100755 --- a/qloader2-install +++ b/qloader2-install @@ -3,17 +3,19 @@ set -e # We take 1 argument, the device to use. -if [ -z "$1" ]; then - echo "Usage: $0 " +if [ -z "$2" ]; then + echo "Usage: $0 " exit 1 fi # Variables. -DEVICE="$1" +DEVICE="$2" MBR="$(mktemp)" -QLOADER2="src/qloader2.bin" +QLOADER2="$1" # Copy the loader to the device. dd if="$DEVICE" of="$MBR" bs=1 count=64 skip=446 dd if="$QLOADER2" of="$DEVICE" conv=notrunc dd if="$MBR" of="$DEVICE" conv=notrunc bs=1 count=64 seek=446 + +rm "$MBR" diff --git a/qloader2.bin b/qloader2.bin new file mode 100644 index 0000000000000000000000000000000000000000..7269a98d8426710bdca080a47eda5ff8dedcb42f GIT binary patch literal 32768 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 literal 0 HcmV?d00001