summaryrefslogtreecommitdiff
path: root/efi/README.md
blob: fa1cdd1dfbda4d4e7633ced671c26af5b74e67c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# efi — болваночный UEFI-апп на портированном тулчейне Plan 9

Минимальное `bootx64.efi` (amd64, формат **PE32+**), собранное **только**
портированными Plan 9 kencc `6a`/`6c`/`6l` — без юниксовых компиляторов/линкеров.

## Цепочка
| шаг | утилита | что делает |
|-----|---------|-----------|
| 1 | **6a** | ассемблирует `pe64min.s` — DOS/PE32+ заголовок + entry + `eficall` |
| 2 | **6c** | компилирует `hello.c` (плановские `<u.h>` и т.д.) |
| 3 | **6l** | линкует свободностоящий образ по `-T0x8000` |
| 4 | `dd skip=40` | срезает 40-байтный plan9 a.out заголовок → обнажает PE32+ |

`pe64.s` кладёт DOS+PE32+ заголовки первыми в текст-сегмент; линкер раскладывает
образ от `IMAGEBASE`, а `dd` срезает плановский заголовок — остаётся чистый PE,
который прошивка грузит из `/EFI/BOOT/BOOTX64.EFI`.

## Сборка
```sh
./fetch_ref.sh                              # pe64.s/efi.h/mem.h из 9legacy
PLAN9SRC=.../plan9foundation ./efi_build.sh # -> bootx64.efi
python3 mkesp.py bootx64.efi esp.img        # -> загрузочный ESP (FAT16)
qemu-system-x86_64 -bios OVMF.fd -drive format=raw,file=esp.img
```

## Что своё, что референс
* `hello.c`, `efi_build.sh`, `mkesp.py`, `fetch_ref.sh` — наш код.
* `pe64.s`, `efi.h`, `mem.h` — из 9legacy `nboot/efi` (тянутся, не хранятся).
  Для болванки от `pe64.s` берём только заголовки+entry+`eficall` (`head -162`);
  машинерию загрузки ядра (`jump`/`_warp32`/`_gdt`) отбрасываем — ей тут нечего делать.

## Проверка
`MZ` + `PE\0\0` + Machine `0x8664` + Magic `0x20B` (PE32+) + Subsystem `10`
(EFI_APPLICATION). `mkesp.py` дополнительно сам обходит FAT обратно и сверяет
`/EFI/BOOT/BOOTX64.EFI` байт-в-байт с исходным `.efi`.