diff options
| author | claude <[email protected]> | 2026-07-12 01:19:32 +0000 |
|---|---|---|
| committer | claude <[email protected]> | 2026-07-12 01:19:32 +0000 |
| commit | a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 (patch) | |
| tree | b0a0ad513792f5c0ddc524d67f6ab89e2044c642 | |
| download | plan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.tar.gz plan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.zip | |
π plan9-kencc-linux: ΠΊΡΠΎΡΡ-ΡΡΠ»ΡΠ΅ΠΉΠ½ Plan9 (cc/as/ld) + EFI-Π±ΠΎΠ»Π²Π°Π½ΠΊΠ°
- build_arch.sh / build_al.sh: ΡΠ±ΠΎΡΠΊΠ° kencc-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ², Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠ²,
Π»ΠΈΠ½ΠΊΠ΅ΡΠΎΠ² Π²ΡΠ΅Ρ
Π°ΡΠΎΠΊ (5/6/8/v/q/k) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅ ΡΠ΅ΡΠ΅Π· plan9port.
- ΠΏΠ°ΡΡΠΈ ΠΏΠΎΠ΄ musl/gcc: sbrk->mmap, round/log2->p9*, Runemask, swcmp const,
-fcommon, machcap/omachcap, /sys ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠ°ΠΉΠ»Ρ. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π² PATCHES.md.
- bin/: Π³ΠΎΡΠΎΠ²ΡΠ΅ 8c 6c 5c vc qc kc + 6a 6l (Linux/musl x86_64).
- efi/: Π±ΠΎΠ»Π²Π°Π½ΠΎΡΠ½ΡΠΉ bootx64.efi (PE32+) ΡΠ΅ΠΌ ΠΆΠ΅ ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ (6a+6c+6l+dd),
ΡΠ΅ΡΠ΅ΡΠ΅Π½Ρ β 9legacy nboot/efi; ESP-ΠΎΠ±ΡΠ°Π· ΡΠ΅ΡΠ΅Π· mkesp.py.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
| -rw-r--r-- | .gitignore | 15 | ||||
| -rw-r--r-- | NOTICE | 22 | ||||
| -rw-r--r-- | PATCHES.md | 58 | ||||
| -rw-r--r-- | README.md | 75 | ||||
| -rwxr-xr-x | bin/5c | bin | 0 -> 1006072 bytes | |||
| -rwxr-xr-x | bin/6a | bin | 0 -> 408832 bytes | |||
| -rwxr-xr-x | bin/6c | bin | 0 -> 1094136 bytes | |||
| -rwxr-xr-x | bin/6l | bin | 0 -> 546056 bytes | |||
| -rwxr-xr-x | bin/8c | bin | 0 -> 1135776 bytes | |||
| -rwxr-xr-x | bin/kc | bin | 0 -> 979568 bytes | |||
| -rwxr-xr-x | bin/qc | bin | 0 -> 1053832 bytes | |||
| -rwxr-xr-x | bin/vc | bin | 0 -> 981056 bytes | |||
| -rw-r--r-- | efi/README.md | 35 | ||||
| -rw-r--r-- | efi/efi_build.sh | 32 | ||||
| -rw-r--r-- | efi/fetch_ref.sh | 24 | ||||
| -rw-r--r-- | efi/hello.c | 52 | ||||
| -rw-r--r-- | efi/mkesp.py | 108 | ||||
| -rw-r--r-- | scripts/build_al.sh | 57 | ||||
| -rw-r--r-- | scripts/build_all.sh | 19 | ||||
| -rw-r--r-- | scripts/build_arch.sh | 68 | ||||
| -rw-r--r-- | scripts/setup.sh | 30 |
21 files changed, 595 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65f10ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΡΡΡΡ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ +deps/ +efi/nboot.diff +efi/pe64.s +efi/pe64min.s +efi/efi.h +efi/mem.h +# Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ ΡΠ±ΠΎΡΠΊΠΈ +build/ +*.o +*.6 *.5 *.8 *.v *.q *.k +*.out +efi/bootx64.efi +efi/*.img +y.tab.* @@ -0,0 +1,22 @@ +plan9-kencc-linux β Π°Π²ΡΠΎΡΡΡΠ²ΠΎ ΠΈ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ +======================================== + +ΠΠ°Ρ ΠΊΠΎΠ΄ (ΡΠ±ΠΎΡΠΎΡΠ½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ, efi/hello.c, efi/efi_build.sh, efi/mkesp.py, +efi/fetch_ref.sh, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ) β ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅. + +Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΠ Π²Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π° ΡΡΠ½Π΅ΡΡΡ +ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ: + +* ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ/Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΡ/Π»ΠΈΠ½ΠΊΠ΅ΡΡ Plan 9 (kencc) ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ β + ΠΈΠ· Π΄Π΅ΡΠ΅Π²Π° ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² Plan 9 (plan9foundation / ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ³ΠΎ). + ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ Plan 9 (MIT-style, ΡΠ°Π½Π΅Π΅ Lucent Public License). + +* Π’ΡΠ»ΡΠ΅ΠΉΠ½-ΠΎΠ±Π²ΡΠ·ΠΊΠ° lib9/libbio/libmach ΠΈ 9c/9l/9ar/yacc β plan9port + (https://github.com/9fans/plan9port), Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ plan9port. + +* Π Π΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΡΠΉ EFI-Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ (pe64.s, efi.h, mem.h) β 9legacy, nboot/efi + (http://9legacy.org/9legacy/patch/nboot.diff). Π’ΡΠ½Π΅ΡΡΡ efi/fetch_ref.sh, + Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΠ Ρ
ΡΠ°Π½ΠΈΡΡΡ. ΠΠΈΡΠ΅Π½Π·ΠΈΡ β ΠΊΠ°ΠΊ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Plan 9. + +ΠΠΎΡΠΎΠ²ΡΠ΅ Π±ΠΈΠ½Π°ΡΠΈ Π² bin/ ΡΠΎΠ±ΡΠ°Π½Ρ ΠΈΠ· Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² Π½Π°ΡΠΈΠΌΠΈ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ +ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΡΡ ΠΈΡ
Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ. diff --git a/PATCHES.md b/PATCHES.md new file mode 100644 index 0000000..f8b20aa --- /dev/null +++ b/PATCHES.md @@ -0,0 +1,58 @@ +# ΠΠ°ΡΡΠΈ ΠΏΠΎΠ΄ ΡΠ±ΠΎΡΠΊΡ kencc Π½Π° Linux-Ρ
ΠΎΡΡΠ΅ + +ΠΡΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ `scripts/build_arch.sh` ΠΈ `build_al.sh` +Π½Π° ΡΠ²Π΅ΠΆΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² (ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π΅ ΡΡΠΎΠ³Π°Π΅ΡΡΡ). ΠΠΈΠΆΠ΅ β ΡΡΠΎ ΠΈ Π·Π°ΡΠ΅ΠΌ. + +## 1. `round` / `log2` β `p9round` / `p9log2` +`cc/` ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ²ΠΎΠΈ `round()` ΠΈ `log2()`, ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠ΅ ΠΏΠΎ ΡΠΈΠΏΡ Ρ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°ΠΌΠΈ +ΠΈΠ· musl `math.h`. ΠΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ Π²ΡΠ·ΠΎΠ²Ρ Π²ΠΎ Π²ΡΠ΅Ρ
ΡΠ°ΠΉΠ»Π°Ρ
(ΠΈ Π² +ΡΠ³Π΅Π½Π΅ΡΡΠ½Π½ΠΎΠΌ `y.tab.c`). Π€Π°ΠΉΠ»Ρ: `cc/dcl.c`, `cc/pgen.c`, `cc/sub.c`, `cc/cc.h`, +`Xc/swt.c`, `Xc/cgen.c`. + +## 2. ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΡΡΡ `#include "y.tab.h"` +`y.tab.h` (Π³Π΅Π½Π΅ΡΠΈΡ yacc) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΠΏ `Node`, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ Π² `cc.h`, ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ +include-guard. ΠΠ½Π°ΡΠΈΡ: Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΡΡΠΎΠ³ΠΎ ΠΠΠ‘ΠΠ `cc.h` ΠΈ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· (ΠΈΠ½Π°ΡΠ΅ +ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ `YYSTYPE`/`yylval`). Π ΡΠ²Π΅ΠΆΠ΅ΠΌ `lex.c` ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΆΠ΅ +Π²Π΅ΡΠ½ΡΠΉ β ΠΏΡΠ°Π²ΠΊΠ° Π½ΡΠΆΠ½Π° Π±ΡΠ»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΡΡΠ½ΠΎΠΉ Π²ΠΎΠ·Π½Π΅. + +## 3. ΠΠ»ΠΎΡΠΊΠ°Ρ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΊΠ° include +ΠΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠΎΡΠ΅Π΄Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ: `#include "../cc/cc.h"`, +`"../6c/6.out.h"`, `"../8l/elf.h"`, extension-less `"compat"`, `"macbody"`, +`"lexbody"`. Π‘ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π²ΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΡΠ΅Π·Π°Π΅ΠΌ `../*/` ΠΈΠ· include. +Extension-less ΡΠ°ΠΉΠ»Ρ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ²Π½ΠΎ. + +## 4. `Runemask` +ΠΠ»Π°Π½ΠΎΠ²ΡΠΊΠ°Ρ libc-ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° `Runemask` (ΠΌΠ°ΡΠΊΠ° 21-Π±ΠΈΡΠ½ΠΎΠΉ ΡΡΠ½Ρ) Π΅ΡΡΡ Π² ΡΠΎΠ΄Π½ΠΎΠΉ Plan9, +Π½ΠΎ ΠΠ Π² plan9port. ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ `#define Runemask 0x1FFFFF` Π² `lex.c`. + +## 5. ΠΡΠΎΡΠΎΡΠΈΠΏ `swcmp` β `const` +`swcmp` β ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡ Π΄Π»Ρ `qsort`. Π£ musl ΡΠΈΠ³Π½Π°ΡΡΡΠ° `int(const void*, const void*)`, +Π° ΠΏΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π² `gc.h` β `int(void*, void*)`. ΠΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΠΊ `const`. + +## 6. `-fcommon` +Π‘ΡΠ°ΡΡΠΉ ΠΊΠΎΠ΄ Π΄Π΅ΡΠΆΠΈΡ tentative-Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΠΈ Π³Π»ΠΎΠ±Π°Π»ΠΎΠ² (Π½Π°ΠΏΡ. `hintabsize` Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
+`.c` ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠΈΠΉ `gc.h`). Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ gcc ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `-fno-common` ΠΈ ΡΡΠ³Π°Π΅ΡΡΡ Π½Π° +multiple definition. ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ Ρ `-fcommon` (ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅). + +## 7. `mysbrk`: `sbrk()` β `mmap()` β ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΉ +Hunk-Π°Π»Π»ΠΎΠΊΠ°ΡΠΎΡ kencc Π±Π΅ΡΡΡ ΠΏΠ°ΠΌΡΡΡ ΡΠ΅ΡΠ΅Π· `mysbrk` β `sbrk()`. ΠΠ° musl `sbrk()` +Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ `-1` (Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ malloc), ΠΈΠ·-Π·Π° ΡΠ΅Π³ΠΎ `gethunk()` +ΠΏΠ°Π΄Π°Π» Π² Β«out of memoryΒ» β `exits`, ΠΏΡΠΈΡΡΠΌ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΡΡ
ΠΎΠ΄ΠΈΠ»Π° Π² Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ +Bio-Π±ΡΡΠ΅Ρ ΠΈ ΡΠ΅ΡΡΠ»Π°ΡΡ (ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΌΠΎΠ»ΡΠ° Π²ΡΡ
ΠΎΠ΄ΠΈΠ» Ρ ΠΊΠΎΠ΄ΠΎΠΌ 1). ΠΠ°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ΅Π»ΠΎ `mysbrk` +Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΉ `mmap`. ΠΠ΅Π· ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π»ΠΈΠ½ΠΊΡΡΡΡΡ, Π½ΠΎ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡ. + +## 8. ΠΡΠ±Π»ΠΈΠΊΠ°Ρ `machcap` / `omachcap` +`cc/omachcap.c` (ΡΡΠ°ΡΡΠΉ machcap) ΠΈ `Xc/machcap.c` (Π½ΠΎΠ²ΡΠΉ) ΠΎΠ±Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ `machcap`. +Π ΡΠΎΠ΄Π½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ `omachcap.o` Π΄ΡΠ΅ΠΌΠ»Π΅Ρ Π² Π°ΡΡ
ΠΈΠ²Π΅ `cc.a` ΠΈ Π½Π΅ ΡΡΠ½Π΅ΡΡΡ. Π£ Π½Π°Ρ β Π»ΠΈΠ½ΠΊΡΠ΅ΠΌ +ΠΏΠ»ΠΎΡΠΊΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ: Π΅ΡΠ»ΠΈ Ρ Π°ΡΠΊΠΈ Π΅ΡΡΡ ΡΠ²ΠΎΠΉ `machcap.o` (6c/8c/qc) β Π²ΡΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ +`omachcap.o`; Π΅ΡΠ»ΠΈ Π½Π΅Ρ (5c/vc/kc) β `omachcap.o` ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ `machcap`. + +## 9. ΠΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠ΅ ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠ°ΠΉΠ»Ρ Π²ΠΎΠ½ +Π€Π°ΠΉΠ»Ρ Π²ΡΠΎΠ΄Π΅ `Xc/sys.c` ΡΡΠ½ΡΡ `#include "/sys/src/libc/9syscall/sys.h"` β ΡΡΠΎ +ΡΠ°Π½ΡΠ°ΠΉΠΌ ΠΠ‘, Π½Π΅ ΡΠ°ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°, ΠΈ Π² `OFILES` mkfile ΠΈΡ
Π½Π΅Ρ. ΠΡΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ Π»ΡΠ±ΡΠ΅ +`.c` Ρ include ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠΌΡ `/sys/...`. + +## 10. ΠΠ²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΠΎΡΡΡ `cc/` ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅ ΠΈΠΌΡΠ½ (kc) +Π£ `kc` Π·Π°Π²Π°Π»ΡΠ»ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ `bits.c`, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΡΠΆΠ΅ Π²ΡΡΠ΅Π·Π°Π½Π½ΡΠΉ ΠΈΠ· +plan9port ΡΠΎΡΠΌΠ°ΡΠ½ΡΠΉ ΡΠΈΠΏ `Fconv`. ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ `cc/`-ΡΠ°ΠΉΠ»Ρ ΠΠΠ‘ΠΠ Π°ΡΠΎΡΠ½ΡΡ
, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠΈΠΉ +`cc/bits.c` (Π½ΠΎΠ²ΡΠΉ fmt API) ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π». diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba80bb4 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# plan9-kencc-linux + +ΠΡΠΎΡΡ-ΡΠ±ΠΎΡΠΊΠ° **ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² / Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠ² / Π»ΠΈΠ½ΠΊΠ΅ΡΠΎΠ² Plan 9 (kencc)** Π΄Π»Ρ Π²ΡΠ΅Ρ
+Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡ **Ρ Linux-Ρ
ΠΎΡΡΠ°**, ΠΏΠ»ΡΡ Π±ΠΎΠ»Π²Π°Π½ΠΎΡΠ½ΠΎΠ΅ **UEFI-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅** (PE32+), +ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠ΅ ΡΡΠΈΠΌ ΠΆΠ΅ ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ. ΠΠΈΡΠ΅Π³ΠΎ ΡΠ½ΠΈΠΊΡΠΎΠ²ΠΎΠ³ΠΎ Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΡΠ°ΠΌΠΈΡ
`.efi`. + +Π‘ΠΎΠ±ΡΠ°Π½ΠΎ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° Linux/musl. ΠΠΈΠ»ΠΈΠ»ΠΎΡΡ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ-Π±ΠΎΡΠΎΠΌ (Claude) ΠΏΠΎ Π·Π°ΠΊΠ°Π·Ρ +ΡΠ°ΡΠ° ancap.in.ua. + +## Π§ΡΠΎ Π²Π½ΡΡΡΠΈ +``` +bin/ Π³ΠΎΡΠΎΠ²ΡΠ΅ Π±ΠΈΠ½Π°ΡΠΈ: 8c 6c 5c vc qc kc (ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ) + 6a 6l +scripts/ + setup.sh ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅Ρ plan9foundation + plan9port, ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ plan9port + build_arch.sh <X> ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π°ΡΠΊΠΈ X (5|6|8|v|q|k) + build_al.sh <Xa|Xl> ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ/Π»ΠΈΠ½ΠΊΠ΅Ρ + build_all.sh ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π²Π΅ΡΡ ΠΊΡΠΎΡΡ-ΠΊΠΈΡ +efi/ + hello.c ΡΠ°ΠΌ EFI-Π°ΠΏΠΏ (Π½Π°Ρ ΠΊΠΎΠ΄) + fetch_ref.sh ΡΡΠ½Π΅Ρ pe64.s/efi.h/mem.h ΠΈΠ· 9legacy (nboot/efi) + efi_build.sh 6a+6c+6l -> dd -> bootx64.efi (PE32+) + mkesp.py Π·Π°Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ .efi Π² Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ ESP (FAT16) +patches/ ΠΏΠ°ΡΡΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡΠ°Π²ΠΊΠ΅ (Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ) +PATCHES.md ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΡΡ Π½ΡΠΆΠ΅Π½ +``` + +## ΠΠ΄Π΅Ρ +Π€ΡΠΎΠ½ΡΠ΅Π½Π΄-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Plan 9 (`cc/`) + ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ Π°ΡΠΎΠΊ (`5c`,`6c`,`8c`,`vc`,`qc`,`kc`) +ΠΏΠΈΡΡΡΡΡ Π½Π° Plan 9 C ΠΈ ΡΠ°ΡΡΡΠΈΡΠ°Π½Ρ Π½Π° ΡΠΎΠ΄Π½ΡΡ ΡΠ±ΠΎΡΠΊΡ Π² Plan 9. ΠΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΈΡ
Π½Π° Linux, +ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡ **plan9port**-ΠΎΠ²ΡΠΊΠΈΠΌ `9c`/`9l` (ΠΎΠ½ΠΈ Π΄Π°ΡΡ `lib9`/`libbio`/`libmach` ΠΈ +Π΄ΡΡΠΆΠ°Ρ Ρ Ρ
ΠΎΡΡΠΎΠ²ΡΠΌ gcc/musl). ΠΡΡ, ΡΡΠΎ ΠΌΠ΅ΡΠ°Π΅Ρ, Π»Π΅ΡΠΈΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΡΠ°ΠΌΠΈ (ΡΠΌ. `PATCHES.md`). + +| Π°ΡΠΊΠ° | ΠΊΠΎΠΌΠΏ | Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ | Π»ΠΈΠ½ΠΊΠ΅Ρ | +|------|------|-----------|--------| +| 386 | 8c | 8a | 8l | +| amd64 | 6c | 6a | 6l | +| arm | 5c | 5a | 5l | +| mips | vc | va | vl | +| power | qc | qa | ql | +| sparc | kc | ka | kl | + +## ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ +```sh +# 1. Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (plan9foundation + plan9port) +bash scripts/setup.sh +export PLAN9SRC=$PWD/deps/plan9foundation +export PLAN9PORT=$PWD/deps/plan9port +# (ΠΎΠΏΡ. musl: export MUSL_ENV=/path/to/env.sh) + +# 2. ΡΠΎΠ±ΡΠ°ΡΡ Π²ΡΡ +bash scripts/build_all.sh # -> build/*/{6c,6a,6l,...} + +# 3. ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ +bash scripts/build_arch.sh 6 # -> build/6c/6c + +# 4. ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ +echo 'int f(void){return 42;}' > t.c +build/6c/6c t.c && ls t.6 # ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΈΠΊ Plan9 .6 +``` + +## EFI-Π±ΠΎΠ»Π²Π°Π½ΠΊΠ° +```sh +cd efi +./fetch_ref.sh # pe64.s/efi.h/mem.h ΠΈΠ· 9legacy +PLAN9SRC=$PWD/../deps/plan9foundation ./efi_build.sh +# -> bootx64.efi : PE32+ x64 EFI_APPLICATION +python3 mkesp.py bootx64.efi esp.img # -> Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ ESP (/EFI/BOOT/BOOTX64.EFI) +# Π·Π°ΠΏΡΡΠΊ: qemu-system-x86_64 -bios OVMF.fd -drive format=raw,file=esp.img +``` + +## ΠΠΎΡΠΎΠ²ΡΠ΅ Π±ΠΈΠ½Π°ΡΠΈ +Π `bin/` Π»Π΅ΠΆΠ°Ρ ΡΠΆΠ΅ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ/Π°ΡΠΌ/Π»ΠΈΠ½ΠΊΠ΅Ρ (Linux/musl x86_64). +ΠΠΎΠ΄ ΡΠ²ΠΎΠΉ Ρ
ΠΎΡΡ ΠΏΠ΅ΡΠ΅ΡΠΎΠ±Π΅ΡΠΈ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ β Π±Π°ΠΉΡ-Π²-Π±Π°ΠΉΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΠΎ. + +ΠΠΈΡΠ΅Π½Π·ΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΡΡΠ²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² β ΡΠΌ. `NOTICE`. Binary files differBinary files differBinary files differBinary files differBinary files differBinary files differBinary files differBinary files differdiff --git a/efi/README.md b/efi/README.md new file mode 100644 index 0000000..fa1cdd1 --- /dev/null +++ b/efi/README.md @@ -0,0 +1,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`. diff --git a/efi/efi_build.sh b/efi/efi_build.sh new file mode 100644 index 0000000..51f0ff9 --- /dev/null +++ b/efi/efi_build.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Π±ΠΎΠ»Π²Π°Π½ΠΎΡΠ½ΡΠΉ bootx64.efi (PE32+) ΠΠΠ Π’ΠΠ ΠΠΠΠΠΠ«Π ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ 6a/6c/6l. +# ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ: ./fetch_ref.sh (Π΄ΠΎΡΡΠ°ΡΡ pe64.s/efi.h/mem.h ΠΈΠ· 9legacy). +# Π’ΡΠ΅Π±ΡΠ΅Ρ: BINDIR Ρ 6a/6c/6l (ΠΏΠΎ ΡΠΌΠΎΠ»Ρ. ../bin) ΠΈ PLAN9SRC (ΠΏΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠ΅ include). +set -e +cd "$(dirname "$0")" +BINDIR="${BINDIR:-$PWD/../bin}" +: "${PLAN9SRC:?export PLAN9SRC β Π½ΡΠΆΠ½Ρ ΠΏΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠ΅ include (amd64/include, sys/include)}" +IMAGEBASE=0x8000 +export objtype=amd64 + +[ -f pe64.s ] || { echo "Π½Π΅Ρ pe64.s β ΡΠ½Π°ΡΠ°Π»Π° ./fetch_ref.sh"; exit 1; } +# ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ pe64: MZ+PE Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ + entry + eficall (Π±Π΅Π· Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ° ΡΠ΄ΡΠ°) +head -162 pe64.s > pe64min.s + +rm -f *.6 *.out bootx64.efi +echo "1) 6a pe64min.s"; "$BINDIR/6a" -DIMAGEBASE=$IMAGEBASE pe64min.s +echo "2) 6c hello.c"; "$BINDIR/6c" -I"$PLAN9SRC/amd64/include" -I"$PLAN9SRC/sys/include" hello.c +echo "3) 6l link"; "$BINDIR/6l" -l -s -R1 -T$IMAGEBASE -o bootx64.out pe64min.6 hello.6 +echo "4) dd strip 40b (plan9 a.out header) -> PE32+" +dd if=bootx64.out bs=1 skip=40 of=bootx64.efi 2>/dev/null + +echo "bootx64.efi: $(ls -la bootx64.efi | awk '{print $5}') Π±Π°ΠΉΡ" +python3 - <<'PY' +d=open('bootx64.efi','rb').read(); po=int.from_bytes(d[0x3c:0x40],'little'); o=po+24 +ok = d[:2]==b'MZ' and d[po:po+4]==b'PE\x00\x00' \ + and int.from_bytes(d[po+4:po+6],'little')==0x8664 \ + and int.from_bytes(d[o:o+2],'little')==0x20b \ + and int.from_bytes(d[o+68:o+70],'little')==10 +print("PE32+ x64 EFI_APPLICATION:", "OK" if ok else "BAD") +PY +echo "ESP-ΠΎΠ±ΡΠ°Π·: python3 mkesp.py bootx64.efi esp.img" diff --git a/efi/fetch_ref.sh b/efi/fetch_ref.sh new file mode 100644 index 0000000..67b726b --- /dev/null +++ b/efi/fetch_ref.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Π’ΡΠ½Π΅Ρ ΠΈΠ· 9legacy ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΡΠΉ EFI-Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ (nboot/efi) ΠΈ Π΄ΠΎΡΡΠ°ΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ +# pe64.s (PE32+ ΠΎΠ±ΡΡΡΠΊΠ°), efi.h ΠΈ mem.h. ΠΡΠΎ ΠΠ Π½Π°Ρ ΠΊΠΎΠ΄ β ΡΡΠΎ Plan9/9legacy, +# ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠ°ΡΠ°Π΅ΠΌ, Π° Π½Π΅ Ρ
ΡΠ°Π½ΠΈΠΌ Π² ΡΠ΅ΠΏΠ΅. ΠΠ°Ρ ΠΊΠΎΠ΄ β hello.c/efi_build.sh/mkesp.py. +set -e +cd "$(dirname "$0")" +echo ">> ΠΊΠ°ΡΠ°Ρ 9legacy nboot.diff ..." +python3 -c "import urllib.request; urllib.request.urlretrieve('http://9legacy.org/9legacy/patch/nboot.diff','nboot.diff')" +python3 - <<'PY' +import re +d=open('nboot.diff').read().splitlines() +want={'pe64.s','efi.h','mem.h'}; cur=None; buf=[]; out={} +for l in d: + m=re.match(r'^\+\+\+ .*/nboot/efi/(\S+)', l) + if m: + if cur: out[cur]='\n'.join(buf) + cur=m.group(1) if m.group(1) in want else None; buf=[]; continue + if cur is not None: + if l.startswith('--- '): out[cur]='\n'.join(buf); cur=None; continue + if l.startswith('+'): buf.append(l[1:]) +if cur: out[cur]='\n'.join(buf) +for k,v in sorted(out.items()): open(k,'w').write(v); print(' ΠΈΠ·Π²Π»ΡΠΊ', k, f'({len(v.splitlines())} ΡΡΡΠΎΠΊ)') +PY +echo ">> Π³ΠΎΡΠΎΠ²ΠΎ: pe64.s efi.h mem.h (ΡΠ΅ΡΠ΅ΡΠ΅Π½Ρ 9legacy)" diff --git a/efi/hello.c b/efi/hello.c new file mode 100644 index 0000000..35cd86d --- /dev/null +++ b/efi/hello.c @@ -0,0 +1,52 @@ +/* + * ΠΠΎΠ»Π²Π°Π½ΠΎΡΠ½ΡΠΉ EFI-Π°ΠΏΠΏ Π΄Π»Ρ amd64 (bootx64.efi), PE32+. + * Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΠΠ Π’ΠΠ ΠΠΠΠΠΠ«Π ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ Plan9 (6c/6a/6l) Π½Π° Linux/musl: + * PE-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ entry -> pe64.s (Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ 6a), ΠΈΠ· 9legacy nboot/efi. + * ΠΠ΅ΡΠ°ΡΡ -> UEFI SIMPLE_TEXT_OUTPUT_PROTOCOL (efi.h ΠΈΠ· 9legacy). + * ΠΠΎΠ½ΡΡΠ°ΠΊΡ Π²Ρ
ΠΎΠ΄Π° Π·Π°Π΄Π°ΡΡ pe64.s: reloc ΠΊΠ»Π°Π΄ΡΡ SystemTable, ΠΏΡΡΠ³Π°Π΅Ρ Π½Π° efimain(ih, st). + */ +#include <u.h> +#include "efi.h" + +/* Π³Π»ΠΎΠ±Π°Π»Ρ, ΠΊΠΎΡΠΎΡΡΡ
ΠΆΠ΄ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ (ΠΊΠ°ΠΊ Π² ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΎΠΌ efi.c) */ +EFI_HANDLE IH; +EFI_SYSTEM_TABLE *ST; + +/* Π²ΡΠ·ΠΎΠ² EFI-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ MS-x64 ABI β ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² pe64.s */ +extern uintptr eficall(void *fn, ...); + +/* ΠΏΠ΅ΡΠ°ΡΡ ASCII-ΡΡΡΠΎΠΊΠΈ ΡΠ΅ΡΠ΅Π· ConOut (ΠΊΠΎΠ½Π²Π΅ΡΡ Π² UTF-16, \n -> \r\n) */ +static void +eputs(char *s) +{ + CHAR16 w[2]; + + w[1] = 0; + for(; *s; s++){ + if(*s == '\n'){ + w[0] = '\r'; + eficall(ST->ConOut->OutputString, ST->ConOut, w); + } + w[0] = (uchar)*s; + eficall(ST->ConOut->OutputString, ST->ConOut, w); + } +} + +void +efimain(EFI_HANDLE ih, EFI_SYSTEM_TABLE *st) +{ + IH = ih; + ST = st; + + eputs("\n"); + eputs("+--------------------------------------------------+\n"); + eputs("| Hello from a Plan 9 kencc EFI application |\n"); + eputs("| compiler/assembler/linker: 6c / 6a / 6l |\n"); + eputs("| cross-built on Linux/musl, wrapped as PE32+ |\n"); + eputs("+--------------------------------------------------+\n"); + eputs("\nefimain reached OK. Idling via BootServices->Stall.\n"); + + /* Π±ΠΎΠ»Π²Π°Π½ΠΊΠ°: ΠΏΡΠΎΡΡΠΎ ΠΊΡΡΡΠΈΠΌΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° Π½Π΅ ΡΡΠΈΡΠ°Π»Π° Π½Π°Ρ ΡΠΏΠ°Π²ΡΠΈΠΌΠΈ */ + for(;;) + eficall(ST->BootServices->Stall, (UINTN)1000000); +} diff --git a/efi/mkesp.py b/efi/mkesp.py new file mode 100644 index 0000000..d9ab581 --- /dev/null +++ b/efi/mkesp.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ ESP-ΠΎΠ±ΡΠ°Π· (FAT16) c /EFI/BOOT/BOOTX64.EFI. +# ΠΠ΅Π· mtools/mkfs β Π²ΡΡΡΠ½ΡΡ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ FAT, ΠΏΠ»ΡΡ ΡΠ°ΠΌΠΎΠΏΡΠΎΠ²Π΅ΡΠΊΠ° (ΠΎΠ±Ρ
ΠΎΠ΄ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ). +import struct, sys, os, math + +EFI = sys.argv[1] if len(sys.argv)>1 else "/data/work/chat_-1002129270612/plan9/build/efi/bootx64.efi" +OUT = sys.argv[2] if len(sys.argv)>2 else "/data/work/chat_-1002129270612/plan9/build/efi/esp.img" +data = open(EFI,"rb").read() + +BPS=512; SPC=1; RSVD=1; NFAT=2; ROOTENT=512; TOT=8192 +rootsecs=(ROOTENT*32+BPS-1)//BPS +tmp1=TOT-(RSVD+rootsecs); tmp2=256*SPC+NFAT +FATSZ=(tmp1+tmp2-1)//tmp2 +first_data=RSVD+NFAT*FATSZ+rootsecs +nclus=(TOT-first_data)//SPC +assert nclus>4085, f"ΡΡΠ°Π»ΠΎ Π±Ρ FAT12 ({nclus} ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ²)" + +img=bytearray(TOT*BPS) +# --- boot sector / BPB --- +bs=img +bs[0:3]=b'\xEB\x3C\x90'; bs[3:11]=b'MSWIN4.1' +struct.pack_into('<H',bs,11,BPS); bs[13]=SPC +struct.pack_into('<H',bs,14,RSVD); bs[16]=NFAT +struct.pack_into('<H',bs,17,ROOTENT); struct.pack_into('<H',bs,19,TOT) +bs[21]=0xF8; struct.pack_into('<H',bs,22,FATSZ) +struct.pack_into('<H',bs,24,32); struct.pack_into('<H',bs,26,8) +bs[36]=0x80; bs[38]=0x29; struct.pack_into('<I',bs,39,0x12345678) +bs[43:54]=b'PLAN9 EFI '; bs[54:62]=b'FAT16 ' +bs[510]=0x55; bs[511]=0xAA + +# --- ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² --- +def nclus_for(n): return max(1,(n+BPS*SPC-1)//(BPS*SPC)) +# EFI(dir)=cl2, BOOT(dir)=cl3, ΡΠ°ΠΉΠ»=cl4.. +efi_cl=2; boot_cl=3; file_cl=4 +file_ncl=nclus_for(len(data)) +chain={efi_cl:[0xFFFF], boot_cl:[0xFFFF]} +file_clusters=list(range(file_cl,file_cl+file_ncl)) + +FAT=[0]*(nclus+2) +FAT[0]=0xFFF8; FAT[1]=0xFFFF +FAT[efi_cl]=0xFFFF; FAT[boot_cl]=0xFFFF +for i,c in enumerate(file_clusters): + FAT[c]=0xFFFF if i==len(file_clusters)-1 else file_clusters[i+1] + +def wfat(): + raw=bytearray(FATSZ*BPS) + for i,v in enumerate(FAT): + if i*2+2<=len(raw): struct.pack_into('<H',raw,i*2,v&0xFFFF) + for k in range(NFAT): + off=(RSVD+k*FATSZ)*BPS; img[off:off+len(raw)]=raw +wfat() + +def dirent(name,ext,attr,clus,size): + e=bytearray(32) + e[0:11]=(name.ljust(8)[:8]+ext.ljust(3)[:3]).encode('ascii').upper() + e[11]=attr + struct.pack_into('<H',e,26,clus&0xFFFF) + struct.pack_into('<I',e,28,size) + return e + +def clus_off(c): return (first_data+(c-2)*SPC)*BPS + +# root dir: EFI (dir -> cl2) +root_off=(RSVD+NFAT*FATSZ)*BPS +img[root_off:root_off+32]=dirent("EFI","",0x10,efi_cl,0) +# EFI dir (cl2): '.', '..', BOOT(dir->cl3) +o=clus_off(efi_cl) +img[o:o+32]=dirent(".","",0x10,efi_cl,0) +img[o+32:o+64]=dirent("..","",0x10,0,0) +img[o+64:o+96]=dirent("BOOT","",0x10,boot_cl,0) +# BOOT dir (cl3): '.', '..', BOOTX64.EFI(file->cl4) +o=clus_off(boot_cl) +img[o:o+32]=dirent(".","",0x10,boot_cl,0) +img[o+32:o+64]=dirent("..","",0x10,efi_cl,0) +img[o+64:o+96]=dirent("BOOTX64","EFI",0x20,file_cl,len(data)) +# Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Π° +for i,c in enumerate(file_clusters): + chunk=data[i*BPS*SPC:(i+1)*BPS*SPC] + off=clus_off(c); img[off:off+len(chunk)]=chunk + +open(OUT,"wb").write(img) + +# --- Π‘ΠΠΠΠΠ ΠΠΠΠ ΠΠ: ΠΎΠ±ΠΎΠΉΡΠΈ FAT ΠΈ Π΄ΠΎΡΡΠ°ΡΡ /EFI/BOOT/BOOTX64.EFI --- +im=open(OUT,"rb").read() +def rd(a,n): return im[a:a+n] +def fat(c): return struct.unpack_from('<H',im,(RSVD*BPS)+c*2)[0] +def readdir(off): + ents={} + for i in range(0,BPS,32): + e=im[off+i:off+i+32] + if e[0] in (0,0xE5): continue + nm=e[0:8].decode().strip(); ex=e[8:11].decode().strip() + cl=struct.unpack_from('<H',e,26)[0]; sz=struct.unpack_from('<I',e,28)[0] + key=nm+('.'+ex if ex else '') + ents[key]=(cl,sz,e[11]) + return ents +root=readdir((RSVD+NFAT*FATSZ)*BPS) +efi=readdir(clus_off(root['EFI'][0])) +boot=readdir(clus_off(efi['BOOT'][0])) +cl,sz,_=boot['BOOTX64.EFI'] +out=bytearray() +while cl<0xFFF8: + out+=im[clus_off(cl):clus_off(cl)+BPS*SPC]; cl=fat(cl) +out=out[:sz] +ok = bytes(out)==data +print(f"ESP: {OUT} {len(im)} Π±Π°ΠΉΡ (FAT16, {nclus} ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ², FATSz={FATSZ})") +print(f"ΠΏΡΡΡ /EFI/BOOT/BOOTX64.EFI: {sz} Π±Π°ΠΉΡ") +print("ΡΠ°ΠΌΠΎΠΏΡΠΎΠ²Π΅ΡΠΊΠ° (ΠΎΠ±Ρ
ΠΎΠ΄ FAT == ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»):", "OK" if ok else "FAIL") diff --git a/scripts/build_al.sh b/scripts/build_al.sh new file mode 100644 index 0000000..750f9e0 --- /dev/null +++ b/scripts/build_al.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Plan9 Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ (Xa) ΠΈΠ»ΠΈ Π»ΠΈΠ½ΠΊΠ΅Ρ (Xl) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅. +# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: PLAN9SRC=... PLAN9PORT=... build_al.sh 6a | build_al.sh 6l +set -e +T="$1"; [ -z "$T" ] && { echo "usage: $0 <Π½Π°ΠΏΡ. 6a|6l|8a|8l>"; exit 1; } +X="${T:0:1}"; K="${T:1:1}" + +: "${PLAN9SRC:?ΡΠΊΠ°ΠΆΠΈ PLAN9SRC}"; : "${PLAN9PORT:?ΡΠΊΠ°ΠΆΠΈ PLAN9PORT}" +[ -n "$MUSL_ENV" ] && . "$MUSL_ENV" +export PLAN9="$PLAN9PORT"; export PATH="$PLAN9/bin:$PATH" +SRC="$PLAN9SRC/sys/src/cmd" +OUT="${OUT:-$PWD/build}"; B="$OUT/$T" + +rm -rf "$B"; mkdir -p "$B"; cd "$B" +cp "$SRC/$T"/* "$B"/ 2>/dev/null || true +cp "$SRC/${X}c"/*.h "$B"/ 2>/dev/null || true # X.out.h +cp "$SRC"/cc/compat "$SRC"/cc/macbody "$SRC"/cc/lexbody "$SRC"/cc/cc.h "$B"/ 2>/dev/null || true +if [ "$K" = "l" ]; then # Π»ΠΈΠ½ΠΊΠ΅ΡΡ: ΠΈΠΌΠ΅Π½Π° ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ² + ΠΎΠ±ΡΠΈΠΉ ELF-Π²ΡΠ²ΠΎΠ΄ + cp "$SRC/${X}c"/enam.c "$B"/ 2>/dev/null || true + cp "$SRC"/8l/elf.c "$SRC"/8l/elf.h "$B"/ 2>/dev/null || true +fi + +# ---- ΠΏΠ°ΡΡΠΈ (ΡΠ΅ ΠΆΠ΅, ΡΡΠΎ ΠΈ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ²) ---- +for c in *.c; do grep -qE '#include[ \t]*[<"]/sys/' "$c" 2>/dev/null && { echo " ΠΏΡΠΎΠΏΡΡΠΊ: $c"; rm -f "$c"; }; done +sed -i 's|"\.\./[a-zA-Z0-9]*/|"|g' *.c *.h 2>/dev/null || true +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' *.c *.h compat macbody lexbody 2>/dev/null || true +python3 - <<'PY' +import glob,re +pat=re.compile(r'\{\s*return\s+sbrk\s*\(\s*(\w+)\s*\)\s*;\s*\}') +mm='''{ +\tvoid *p; +\tp = mmap(0, %s, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +\tif(p == MAP_FAILED) return (void*)-1; +\treturn p; +}''' +for f in glob.glob('*')+['compat']: + try: s=open(f).read() + except: continue + if 'sbrk(' in s and 'mmap' not in s: + m=pat.search(s) + if m: + s2=pat.sub(mm%m.group(1), s, count=1) + if '#include <sys/mman.h>' not in s2: s2='#include <sys/mman.h>\n'+s2 + open(f,'w').write(s2); print(" mmap-ΠΏΠ°ΡΡ:",f) +PY +[ -f a.y ] && { yacc -d a.y; sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' y.tab.c 2>/dev/null || true; } + +ok=0; fail=0; errf=""; rm -f *.o +for f in *.c; do + if 9c -fcommon -I. "$f" >/tmp/al_$$ 2>&1; then ok=$((ok+1)); else fail=$((fail+1)); [ -z "$errf" ] && errf="$f" && cp /tmp/al_$$ /tmp/alf_$$; fi +done +echo "[$T] ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ: OK=$ok FAIL=$fail" +[ "$fail" != 0 ] && { echo "ΠΏΠ΅ΡΠ²Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ($errf):"; head -10 /tmp/alf_$$; exit 2; } + +if [ "$K" = "l" ]; then EXTRA="-lmach"; else EXTRA=""; fi # Π»ΠΈΠ½ΠΊΠ΅ΡΡ Π½ΡΠΆΠ΅Π½ libmach +9l -o "$T" *.o $EXTRA +echo "[$T] Π±ΠΈΠ½Π°ΡΡ: $(ls -la $T | awk '{print $5}') Π±Π°ΠΉΡ -> $B/$T" diff --git a/scripts/build_all.sh b/scripts/build_all.sh new file mode 100644 index 0000000..7f058aa --- /dev/null +++ b/scripts/build_all.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΠΠ‘Π¬ ΠΊΡΠΎΡΡ-ΠΊΠΈΡ: C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ + Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΡ + Π»ΠΈΠ½ΠΊΠ΅ΡΡ Π²ΡΠ΅Ρ
Π°ΡΠΎΠΊ. +# Π’ΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
PLAN9SRC ΠΈ PLAN9PORT (ΡΠΌ. setup.sh). +set -e +here="$(cd "$(dirname "$0")" && pwd)" +: "${PLAN9SRC:?export PLAN9SRC (ΡΠΌ. scripts/setup.sh)}" +: "${PLAN9PORT:?export PLAN9PORT (ΡΠΌ. scripts/setup.sh)}" +export OUT="${OUT:-$PWD/build}" + +echo "=== C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_arch.sh" $X; done +echo "=== Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_al.sh" ${X}a || echo " (${X}a β ΠΏΡΠΎΠΏΡΡΠ΅Π½/ΠΎΡΠΈΠ±ΠΊΠ°)"; done +echo "=== Π»ΠΈΠ½ΠΊΠ΅ΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_al.sh" ${X}l || echo " (${X}l β ΠΏΡΠΎΠΏΡΡΠ΅Π½/ΠΎΡΠΈΠ±ΠΊΠ°)"; done + +echo +echo "=== ΡΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ Π±ΠΈΠ½Π°ΡΠΈ ($OUT) ===" +find "$OUT" -maxdepth 2 -type f -perm -u+x \( -name '[0-9kvq][cal]' \) -printf '%f %s Π±Π°ΠΉΡ\n' 2>/dev/null | sort diff --git a/scripts/build_arch.sh b/scripts/build_arch.sh new file mode 100644 index 0000000..3cdc4fb --- /dev/null +++ b/scripts/build_arch.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Plan9 kencc C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ Π°ΡΠΊΠΈ X (5,6,8,v,q,k) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅. +# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: PLAN9SRC=.../plan9foundation PLAN9PORT=.../plan9port build_arch.sh 6 +# ΠΠΏΡ.: MUSL_ENV=.../env.sh (Π°ΠΊΡΠΈΠ²Π°ΡΠΎΡ musl-ΡΡΠ»ΡΠ΅ΠΉΠ½Π°), OUT=ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ±ΠΎΡΠΊΠΈ. +set -e +X="$1"; [ -z "$X" ] && { echo "usage: $0 <arch: 5|6|8|v|q|k>"; exit 1; } +A="${X}c" + +: "${PLAN9SRC:?ΡΠΊΠ°ΠΆΠΈ PLAN9SRC β Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² plan9 (plan9foundation)}" +: "${PLAN9PORT:?ΡΠΊΠ°ΠΆΠΈ PLAN9PORT β ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ plan9port (bin/9c,9l,9ar,yacc + lib/)}" +[ -n "$MUSL_ENV" ] && . "$MUSL_ENV" +export PLAN9="$PLAN9PORT"; export PATH="$PLAN9/bin:$PATH" +SRC="$PLAN9SRC/sys/src/cmd" +OUT="${OUT:-$PWD/build}" +B="$OUT/$A" + +rm -rf "$B"; mkdir -p "$B"; cd "$B" +# ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½ Π°ΡΠΊΠΈ Π‘ΠΠΠ§ΠΠΠ, ΠΏΠΎΡΠΎΠΌ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ cc/ β cc/ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΠΏΡΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΠΈΠΌΡΠ½ +# (Ρ kc ΡΠ²ΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ bits.c Ρ Fconv β Π±Π΅ΡΡΠΌ cc/bits.c) +cp "$SRC/$A"/*.c "$SRC/$A"/*.h "$B"/ +cp "$SRC"/cc/*.c "$SRC"/cc/*.h "$B"/ +cp "$SRC"/cc/compat "$SRC"/cc/macbody "$SRC"/cc/lexbody "$B"/ 2>/dev/null || true + +# ---- ΠΠΠ’Π§Π ΠΏΠΎΠ΄ Π»ΠΈΠ½ΡΠΊΡ-Ρ
ΠΎΡΡ ---- +# 0) Π²ΡΠΊΠΈΠ½ΡΡΡ ΠΏΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠ΅ ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠ°ΠΉΠ»Ρ (ΡΡΠ½ΡΡ /sys/... Ρ
Π΅Π΄Π΅ΡΡ, Π½Π΅ ΡΠ°ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°) +for c in *.c; do grep -qE '#include[ \t]*[<"]/sys/' "$c" 2>/dev/null && { echo " ΠΏΡΠΎΠΏΡΡΠΊ ΡΠ°Π½ΡΠ°ΠΉΠΌ: $c"; rm -f "$c"; }; done +# 1) ΠΏΠ»ΠΎΡΠΊΠ°Ρ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΊΠ°: ΡΠ±ΡΠ°ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ../cc/ ../Xc/ +sed -i "s|\"\.\./cc/|\"|g; s|\"\.\./${A}/|\"|g" *.c *.h 2>/dev/null || true +# 2) round/log2 ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ Ρ musl math.h -> p9round/p9log2 +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' *.c *.h compat macbody lexbody 2>/dev/null || true +# 3) Runemask Π½Π΅Ρ Π² plan9port +grep -q 'define Runemask' lex.c || sed -i '/#include[ \t]*"y.tab.h"/a #ifndef Runemask\n#define Runemask 0x1FFFFF\n#endif' lex.c +# 3b) ΠΏΡΠΎΡΠΎΡΠΈΠΏ swcmp -> const (musl qsort-ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡ) +sed -i 's/swcmp(void\*, *void\*)/swcmp(const void*, const void*)/' gc.h *.h 2>/dev/null || true +# 4) mysbrk: sbrk() Π½Π° musl ΠΎΡΠ΄Π°ΡΡ -1 -> mmap +python3 - "$B/compat" <<'PY' +import sys +p=sys.argv[1]; s=open(p).read() +old='void*\nmysbrk(ulong size)\n{\n\treturn sbrk(size);\n}' +new='''#include <sys/mman.h> +void* +mysbrk(ulong size) +{ +\tvoid *p; +\tp = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +\tif(p == MAP_FAILED) return (void*)-1; +\treturn p; +}''' +if old in s: open(p,'w').write(s.replace(old,new)); print(" mmap-ΠΏΠ°ΡΡ: ΠΎΠΊ") +else: print(" mmap-ΠΏΠ°ΡΡ: ΠΏΠ°ΡΡΠ΅ΡΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½") +PY + +# ---- yacc: cc.y -> y.tab.c / y.tab.h ---- +yacc -d cc.y 2>/dev/null || yacc -d "$SRC/cc/cc.y" +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' y.tab.c 2>/dev/null || true + +# ---- ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ (-fcommon: tentative-Π³Π»ΠΎΠ±Π°Π»Ρ ΠΏΠΎΠ΄ gcc -fno-common) ---- +ok=0; fail=0; errf=""; rm -f *.o +for f in *.c; do + if 9c -fcommon -I. "$f" >/tmp/ba_$$ 2>&1; then ok=$((ok+1)); else fail=$((fail+1)); [ -z "$errf" ] && errf="$f" && cp /tmp/ba_$$ /tmp/baf_$$; fi +done +echo "[$A] ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ: OK=$ok FAIL=$fail" +[ "$fail" != 0 ] && { echo "ΠΏΠ΅ΡΠ²Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ($errf):"; head -8 /tmp/baf_$$; exit 2; } + +# ---- Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ°: ΡΠ²ΠΎΠΉ machcap.o -> Π²ΡΠΊΠΈΠ½ΡΡΡ omachcap.o; ΠΈΠ½Π°ΡΠ΅ omachcap ΠΈ Π΅ΡΡΡ machcap ---- +if [ -f machcap.o ]; then LINK=$(ls *.o | grep -v '^omachcap.o$'); else LINK=$(ls *.o); fi +9l -o "$A" $LINK +echo "[$A] Π±ΠΈΠ½Π°ΡΡ: $(ls -la $A | awk '{print $5}') Π±Π°ΠΉΡ -> $B/$A" diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100644 index 0000000..2d693f0 --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# ΠΠΎΡΠΎΠ²ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΡΠ»ΡΠ΅ΠΉΠ½Π°: ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ plan9 + ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ plan9port. +# Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ: git, gcc/clang, make, yacc (ΠΈΠ»ΠΈ plan9port-ΠΎΠ²ΡΠΊΠΈΠΉ). ΠΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΊΠ»Π°Π΄ΡΡΡΡ +# ΡΡΠ΄ΠΎΠΌ ΡΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠΌ (ΠΈΠ»ΠΈ Π² $DEPS). ΠΠΎΡΠ»Π΅ β ΡΠΊΡΠΏΠΎΡΡΠ½ΠΈ PLAN9SRC/PLAN9PORT (ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ Π² ΠΊΠΎΠ½ΡΠ΅). +set -e +DEPS="${DEPS:-$PWD/deps}" +mkdir -p "$DEPS"; cd "$DEPS" + +# 1) Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² plan9 (plan9foundation β ΡΡΡ ΠΆΠΈΠ²ΡΡ cc/ ΠΈ Xc/Xa/Xl) +if [ ! -d plan9foundation ]; then + echo ">> ΠΊΠ»ΠΎΠ½ΠΈΡΡΡ plan9foundation ..." + git clone --depth 1 https://github.com/plan9foundation/plan9.git plan9foundation \ + || git clone --depth 1 https://git.9front.org/plan9front/plan9front plan9foundation +fi + +# 2) plan9port (Π΄Π°ΡΡ 9c/9l/9ar/yacc + lib9/libbio/libmach β ΠΈΠΌΠΈ ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ kencc) +if [ ! -d plan9port ]; then + echo ">> ΠΊΠ»ΠΎΠ½ΠΈΡΡΡ plan9port ..." + git clone --depth 1 https://github.com/9fans/plan9port.git plan9port +fi +if [ ! -x plan9port/bin/9c ]; then + echo ">> ΡΠΎΠ±ΠΈΡΠ°Ρ plan9port (ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΠΏΠ°ΡΡ ΠΌΠΈΠ½ΡΡ) ..." + ( cd plan9port && ./INSTALL -b ) # -b: ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ±ΡΠ°ΡΡ, Π±Π΅Π· ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ +fi + +echo +echo "ΠΠΎΡΠΎΠ²ΠΎ. ΠΠΊΡΠΏΠΎΡΡΠ½ΠΈ:" +echo " export PLAN9SRC=$DEPS/plan9foundation" +echo " export PLAN9PORT=$DEPS/plan9port" +echo " # Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡ musl-ΡΡΠ»ΡΠ΅ΠΉΠ½: export MUSL_ENV=/path/to/env.sh" |
