From cab7a75780ef06fd24bd444f8311b07003ae1dae Mon Sep 17 00:00:00 2001 From: RaphProductions <81994075+RaphProductions@users.noreply.github.com> Date: Tue, 6 May 2025 20:19:48 +0200 Subject: [PATCH] first commit --- .../index/absvdi2.c.54DDD5ACC67061C6.idx | Bin 0 -> 742 bytes .../index/absvsi2.c.DA3C3A3D9E67C194.idx | Bin 0 -> 742 bytes .../index/absvti2.c.5F2C75A775CFB6CC.idx | Bin 0 -> 764 bytes .../index/adddf3.c.E12B9FA5FFF3A116.idx | Bin 0 -> 466 bytes .../index/addsf3.c.6A21188085DB5939.idx | Bin 0 -> 466 bytes .../index/addtf3.c.FFEE1EAA375AB63D.idx | Bin 0 -> 466 bytes .../index/addvdi3.c.264BD2D5F21DA659.idx | Bin 0 -> 746 bytes .../index/addvsi3.c.0CD1DD6CF6936A4C.idx | Bin 0 -> 746 bytes .../index/addvti3.c.9D846B9BFCBFA897.idx | Bin 0 -> 770 bytes .../index/ashldi3.c.6A223231E8170398.idx | Bin 0 -> 1002 bytes .../index/ashlti3.c.B32287C6D4D707E3.idx | Bin 0 -> 1024 bytes .../index/ashrdi3.c.F2CC32C875AE2BB1.idx | Bin 0 -> 1030 bytes .../index/ashrti3.c.547C99831A12A8F7.idx | Bin 0 -> 1052 bytes .../index/bswapdi2.c.3266AE3B38272DC9.idx | Bin 0 -> 610 bytes .../index/bswapsi2.c.6BA49B8A7292856C.idx | Bin 0 -> 610 bytes .../index/clzdi2.c.63FC64DE5751EBB0.idx | Bin 0 -> 846 bytes .../index/clzsi2.c.A37F2C92E88FF3A8.idx | Bin 0 -> 656 bytes .../index/clzti2.c.2A6BBD58CB8D70B2.idx | Bin 0 -> 916 bytes .../index/cmpdi2.c.FD632643048FD20D.idx | Bin 0 -> 954 bytes .../index/cmpti2.c.CC8B1B5751C62B11.idx | Bin 0 -> 976 bytes .../index/comparedf2.c.D2B72062E5C44781.idx | Bin 0 -> 468 bytes .../index/comparesf2.c.B9F43B600A274DEC.idx | Bin 0 -> 468 bytes .../index/comparetf2.c.F02E5BB1109C7844.idx | Bin 0 -> 468 bytes .../clangd/index/cpuid.h.018C95D9E7A01A9C.idx | Bin 0 -> 14204 bytes .../index/ctzdi2.c.12B949AE9BD59CAE.idx | Bin 0 -> 846 bytes .../index/ctzsi2.c.D2E4645FDDB3AA58.idx | Bin 0 -> 656 bytes .../index/ctzti2.c.7FBB5DDBC32996D3.idx | Bin 0 -> 868 bytes .../index/divdc3.c.B02EEEA18AA404A6.idx | Bin 0 -> 466 bytes .../index/divdf3.c.7543317F59E8D2D2.idx | Bin 0 -> 466 bytes .../index/divdi3.c.6BDA5150A6EB1D65.idx | Bin 0 -> 712 bytes .../index/divmoddi4.c.82BCC30251D7E17A.idx | Bin 0 -> 790 bytes .../index/divmodsi4.c.239A327BFFA5B8B6.idx | Bin 0 -> 790 bytes .../index/divmodti4.c.00B492A2BA8BC858.idx | Bin 0 -> 814 bytes .../index/divsc3.c.BE681C46D41E1304.idx | Bin 0 -> 466 bytes .../index/divsf3.c.C99FF64B7B096BFB.idx | Bin 0 -> 466 bytes .../index/divsi3.c.DB00371C9235E262.idx | Bin 0 -> 714 bytes .../index/divtc3.c.A9DCC3E7BDEAF9BE.idx | Bin 0 -> 466 bytes .../index/divtf3.c.B111A0CECA5D3035.idx | Bin 0 -> 466 bytes .../index/divti3.c.44FFFC33CBBD7E11.idx | Bin 0 -> 690 bytes .../index/divxc3.c.905FFC7F29340495.idx | Bin 0 -> 466 bytes .../index/extendbfsf2.c.751092311FFC84C9.idx | Bin 0 -> 472 bytes .../index/extenddftf2.c.7ED44045BFB3B238.idx | Bin 0 -> 470 bytes .../index/extendhfsf2.c.03B8950D16847F43.idx | Bin 0 -> 472 bytes .../index/extendhftf2.c.60BD20BBE0925EBD.idx | Bin 0 -> 472 bytes .../index/extendsfdf2.c.10FA9150AAA23E1B.idx | Bin 0 -> 470 bytes .../index/extendsftf2.c.FBF219AE01DC013A.idx | Bin 0 -> 470 bytes .../index/extendxftf2.c.A63D2056E3253300.idx | Bin 0 -> 472 bytes .../index/ffsdi2.c.79C5DF073C096D49.idx | Bin 0 -> 862 bytes .../index/ffssi2.c.C81326D2B420BC3D.idx | Bin 0 -> 616 bytes .../index/ffsti2.c.10AE75FA4F6916A1.idx | Bin 0 -> 848 bytes .../index/fixdfdi.c.BAC876D4848A9BE1.idx | Bin 0 -> 466 bytes .../index/fixdfsi.c.905155CE468DF06C.idx | Bin 0 -> 466 bytes .../index/fixdfti.c.1C431C9BAAE04900.idx | Bin 0 -> 466 bytes .../index/fixsfdi.c.8E8BDEC974895892.idx | Bin 0 -> 466 bytes .../index/fixsfsi.c.85D5AA2B5053F0FC.idx | Bin 0 -> 466 bytes .../index/fixsfti.c.B78B16B87EA4D0FB.idx | Bin 0 -> 466 bytes .../index/fixtfdi.c.2BE7D60DD19558AA.idx | Bin 0 -> 466 bytes .../index/fixtfsi.c.7F527BC145B84F62.idx | Bin 0 -> 466 bytes .../index/fixtfti.c.11F9211E88441263.idx | Bin 0 -> 466 bytes .../index/fixunsdfdi.c.9DE83BF71DEA5831.idx | Bin 0 -> 468 bytes .../index/fixunsdfsi.c.8F6C0FA84A784C45.idx | Bin 0 -> 468 bytes .../index/fixunsdfti.c.EB752AFC1E65BD8E.idx | Bin 0 -> 468 bytes .../index/fixunssfdi.c.FBEE38152258EB25.idx | Bin 0 -> 468 bytes .../index/fixunssfsi.c.83C331E92668C640.idx | Bin 0 -> 468 bytes .../index/fixunssfti.c.3E5C1FE32DB42663.idx | Bin 0 -> 468 bytes .../index/fixunstfdi.c.7E0F2E026B8A0B3A.idx | Bin 0 -> 468 bytes .../index/fixunstfsi.c.56770C594F3637C0.idx | Bin 0 -> 468 bytes .../index/fixunstfti.c.38A7B9A9D0EA9E22.idx | Bin 0 -> 468 bytes .../index/fixunsxfdi.c.9A84D715BA17B381.idx | Bin 0 -> 468 bytes .../index/fixunsxfsi.c.64A80423C38553CD.idx | Bin 0 -> 468 bytes .../index/fixunsxfti.c.4F483535CE55842C.idx | Bin 0 -> 468 bytes .../index/fixxfdi.c.D44E12EDD8EBE9DD.idx | Bin 0 -> 466 bytes .../index/fixxfti.c.0DDFB1146255EA26.idx | Bin 0 -> 466 bytes .../clangd/index/float.h.625403E5DB9249DE.idx | Bin 0 -> 1090 bytes .../index/floatdidf.c.7CD83C80C431B262.idx | Bin 0 -> 466 bytes .../index/floatdisf.c.5406E7EBA96B77CA.idx | Bin 0 -> 466 bytes .../index/floatditf.c.1801E16467493435.idx | Bin 0 -> 466 bytes .../index/floatdixf.c.6BB823913880BC0B.idx | Bin 0 -> 466 bytes .../index/floatsidf.c.B60844C3948DAD9D.idx | Bin 0 -> 466 bytes .../index/floatsisf.c.C8A64A1A3FD185DE.idx | Bin 0 -> 466 bytes .../index/floatsitf.c.202E46AB119C0745.idx | Bin 0 -> 466 bytes .../index/floattidf.c.683CB983AA96D16A.idx | Bin 0 -> 466 bytes .../index/floattisf.c.DCD4405D90466FEA.idx | Bin 0 -> 466 bytes .../index/floattitf.c.4564D8E4DCE26A5A.idx | Bin 0 -> 466 bytes .../index/floattixf.c.FD40D4766D0CDD61.idx | Bin 0 -> 466 bytes .../index/floatundidf.c.4B10E542023E51BA.idx | Bin 0 -> 470 bytes .../index/floatundisf.c.942666D3EDA3A6C0.idx | Bin 0 -> 470 bytes .../index/floatunditf.c.BB11B91A5C07D1D0.idx | Bin 0 -> 470 bytes .../index/floatundixf.c.852B821C51C856A5.idx | Bin 0 -> 470 bytes .../index/floatunsidf.c.1C1C214B3A3590BE.idx | Bin 0 -> 470 bytes .../index/floatunsisf.c.A55A87C94F7A1ADA.idx | Bin 0 -> 470 bytes .../index/floatunsitf.c.3F63253F59A658AC.idx | Bin 0 -> 470 bytes .../index/floatuntidf.c.4D25F6F2BFB083CE.idx | Bin 0 -> 468 bytes .../index/floatuntisf.c.E8791E75DCCA8ABC.idx | Bin 0 -> 468 bytes .../index/floatuntitf.c.724E7F8ABECFDFC1.idx | Bin 0 -> 468 bytes .../index/floatuntixf.c.EE53F7D637B2A573.idx | Bin 0 -> 470 bytes .../index/fp_mode.c.F75D5BE2C68790A2.idx | Bin 0 -> 466 bytes .../clangd/index/gdt.h.9C8AD8F8054C69EC.idx | Bin 0 -> 1892 bytes .../clangd/index/idt.h.DDC5315D481C1E7B.idx | Bin 0 -> 3100 bytes .../int_div_impl.inc.BD3EFF8675E59301.idx | Bin 0 -> 1024 bytes .../int_endianness.h.5C1E934C459A2C11.idx | Bin 0 -> 228 bytes .../index/int_lib.h.D23BF2CC468A26AE.idx | Bin 0 -> 1762 bytes .../int_mulo_impl.inc.30AD609D66153543.idx | Bin 0 -> 564 bytes .../int_mulv_impl.inc.3446C6A8D30A8A95.idx | Bin 0 -> 650 bytes .../index/int_types.h.C0E7CFD2C94C57DA.idx | Bin 0 -> 2610 bytes .../index/int_util.c.CFBA7320024C669B.idx | Bin 0 -> 886 bytes .../index/int_util.h.B784D7EB2DFF7796.idx | Bin 0 -> 594 bytes .cache/clangd/index/io.h.2E7FA466828E882D.idx | Bin 0 -> 504 bytes .../index/limine.h.425D8D97D5109245.idx | Bin 0 -> 21970 bytes .../index/limits.h.BEAC231889042657.idx | Bin 0 -> 606 bytes .../clangd/index/log.h.E0E90EDA1BF56D22.idx | Bin 0 -> 248 bytes .../index/lshrdi3.c.F40A6E4F6735AE96.idx | Bin 0 -> 978 bytes .../index/lshrti3.c.69AEAB488A42C507.idx | Bin 0 -> 1002 bytes .../clangd/index/main.c.24DB0DF123881CD6.idx | Bin 0 -> 2244 bytes .../index/moddi3.c.0937A263701885EE.idx | Bin 0 -> 666 bytes .../index/modsi3.c.24B72026862E98CE.idx | Bin 0 -> 644 bytes .../index/modti3.c.D1725B244F432BB4.idx | Bin 0 -> 690 bytes .../index/muldc3.c.8D2EEABC115A02E7.idx | Bin 0 -> 466 bytes .../index/muldf3.c.A521637959212EA2.idx | Bin 0 -> 466 bytes .../index/muldi3.c.6FFE6349D685208F.idx | Bin 0 -> 1476 bytes .../index/mulodi4.c.7CFF50D1BA01B277.idx | Bin 0 -> 650 bytes .../index/mulosi4.c.2708019F9F2F0D0C.idx | Bin 0 -> 650 bytes .../index/muloti4.c.DC929331B0044080.idx | Bin 0 -> 694 bytes .../index/mulsc3.c.4410EACF80EF8370.idx | Bin 0 -> 466 bytes .../index/mulsf3.c.D8A52DEB227F4762.idx | Bin 0 -> 466 bytes .../index/multc3.c.4BB74172095852D7.idx | Bin 0 -> 466 bytes .../index/multf3.c.CB329698B6759894.idx | Bin 0 -> 466 bytes .../index/multi3.c.B4D485A74D27D73E.idx | Bin 0 -> 1504 bytes .../index/mulvdi3.c.89FC644540984A34.idx | Bin 0 -> 650 bytes .../index/mulvsi3.c.25B42E22DE493BE9.idx | Bin 0 -> 650 bytes .../index/mulvti3.c.BC97F078FB8E2AB9.idx | Bin 0 -> 694 bytes .../index/mulxc3.c.C38AE5C45E3B1390.idx | Bin 0 -> 466 bytes .../index/negdf2.c.69F8A3ED6F115D2D.idx | Bin 0 -> 466 bytes .../index/negdi2.c.BB3C09D999057BB9.idx | Bin 0 -> 630 bytes .../index/negsf2.c.46A5F3CB8F7D8F7B.idx | Bin 0 -> 466 bytes .../index/negti2.c.2F8F06FD359C92A0.idx | Bin 0 -> 654 bytes .../index/negvdi2.c.A0002A18E7E2AEAD.idx | Bin 0 -> 742 bytes .../index/negvsi2.c.7C1011DBC19242A9.idx | Bin 0 -> 742 bytes .../index/negvti2.c.CCA4924AE800790B.idx | Bin 0 -> 750 bytes .../index/paritydi2.c.76303EDF321B5405.idx | Bin 0 -> 814 bytes .../index/paritysi2.c.73B893623308E5CD.idx | Bin 0 -> 698 bytes .../index/parityti2.c.6C41F097F0FB3C41.idx | Bin 0 -> 900 bytes .../clangd/index/pit.h.FCBDD7EB679035C0.idx | Bin 0 -> 722 bytes .../clangd/index/pmm.h.B0CABFB950313E4E.idx | Bin 0 -> 1066 bytes .../index/popcountdi2.c.8F0CCB351D70021D.idx | Bin 0 -> 670 bytes .../index/popcountsi2.c.E33B79144AFF0E5F.idx | Bin 0 -> 632 bytes .../index/popcountti2.c.0F09C67FEBF85406.idx | Bin 0 -> 786 bytes .../index/powidf2.c.93DBC174A55353AA.idx | Bin 0 -> 466 bytes .../index/powisf2.c.E7998BCBE33C5284.idx | Bin 0 -> 466 bytes .../index/powitf2.c.BDF9DBAB7347A575.idx | Bin 0 -> 466 bytes .../index/powixf2.c.F04F47FDE1D34D1F.idx | Bin 0 -> 468 bytes .../index/printf.h.B451F1322E27C263.idx | Bin 0 -> 2290 bytes .cache/clangd/index/rt.h.4DE1465D2E715A49.idx | Bin 0 -> 1192 bytes .../clangd/index/rtc.h.EEC94DA1B55B20C6.idx | Bin 0 -> 364 bytes .../clangd/index/sched.h.E76F87C7BB1A08D8.idx | Bin 0 -> 1850 bytes .../clangd/index/sse.h.508BF40E84B183FB.idx | Bin 0 -> 296 bytes .../index/stdarg.h.A9A08A3B143D24C3.idx | Bin 0 -> 326 bytes .../index/stdbool.h.0693D9FEB5499621.idx | Bin 0 -> 264 bytes .../index/stddef.h.DD16386422A95BDA.idx | Bin 0 -> 416 bytes .../index/stdint.h.465D5E9EFF387506.idx | Bin 0 -> 3386 bytes .../index/subdf3.c.7B4DE2500F85491F.idx | Bin 0 -> 466 bytes .../index/subsf3.c.B8379285A8FB1003.idx | Bin 0 -> 466 bytes .../index/subtf3.c.2A1CE141BC778302.idx | Bin 0 -> 466 bytes .../index/subvdi3.c.36C79223A475F797.idx | Bin 0 -> 748 bytes .../index/subvsi3.c.A5D87882A951E5E7.idx | Bin 0 -> 748 bytes .../index/subvti3.c.829111C90A78F5E3.idx | Bin 0 -> 772 bytes .../index/truncdfbf2.c.5C4053C67A050699.idx | Bin 0 -> 468 bytes .../index/truncdfhf2.c.3A5024083614A0CD.idx | Bin 0 -> 468 bytes .../index/truncdfsf2.c.A03358D45B4ED38F.idx | Bin 0 -> 468 bytes .../index/truncsfbf2.c.62ADA672DACBA367.idx | Bin 0 -> 468 bytes .../index/truncsfhf2.c.3FFEF4DC19E99F2E.idx | Bin 0 -> 468 bytes .../index/trunctfdf2.c.FD9D1EAC94E4DA09.idx | Bin 0 -> 470 bytes .../index/trunctfhf2.c.D2EAB4EF390B11D1.idx | Bin 0 -> 470 bytes .../index/trunctfsf2.c.B377EBF78748EF30.idx | Bin 0 -> 470 bytes .../index/trunctfxf2.c.19981BF10FD2F99E.idx | Bin 0 -> 470 bytes .../index/truncxfbf2.c.F9E9DA66F162327F.idx | Bin 0 -> 468 bytes .../index/ucmpdi2.c.084AEC36084D5BB3.idx | Bin 0 -> 958 bytes .../index/ucmpti2.c.8E1052AFD84404FD.idx | Bin 0 -> 980 bytes .../index/udivdi3.c.561304CA1C1BE0E9.idx | Bin 0 -> 822 bytes .../index/udivmoddi4.c.70F2B64E31B6BC69.idx | Bin 0 -> 4322 bytes .../index/udivmodsi4.c.8138533E2886502D.idx | Bin 0 -> 764 bytes .../index/udivmodti4.c.46DA76158F034612.idx | Bin 0 -> 2440 bytes .../index/udivsi3.c.B3F1B82AE31AA297.idx | Bin 0 -> 882 bytes .../index/udivti3.c.E62428D445E7E7BF.idx | Bin 0 -> 670 bytes .../index/umoddi3.c.08FC9E378DFD72A1.idx | Bin 0 -> 822 bytes .../index/umodsi3.c.7A9476DD12568553.idx | Bin 0 -> 822 bytes .../index/umodti3.c.DB9DB5C81AF2F756.idx | Bin 0 -> 682 bytes .../clangd/index/vmm.h.3958D0C383864F44.idx | Bin 0 -> 1938 bytes .gitignore | 5 + GNUmakefile | 258 ++++ LICENSE | 12 + README.md | 1 + _.git/HEAD | 1 + _.git/config | 12 + _.git/description | 1 + _.git/hooks/applypatch-msg.sample | 15 + _.git/hooks/commit-msg.sample | 24 + _.git/hooks/fsmonitor-watchman.sample | 174 +++ _.git/hooks/post-update.sample | 8 + _.git/hooks/pre-applypatch.sample | 14 + _.git/hooks/pre-commit.sample | 49 + _.git/hooks/pre-merge-commit.sample | 13 + _.git/hooks/pre-push.sample | 53 + _.git/hooks/pre-rebase.sample | 169 +++ _.git/hooks/pre-receive.sample | 24 + _.git/hooks/prepare-commit-msg.sample | 42 + _.git/hooks/push-to-checkout.sample | 78 + _.git/hooks/sendemail-validate.sample | 77 + _.git/hooks/update.sample | 128 ++ _.git/index | Bin 0 -> 1197 bytes _.git/info/exclude | 6 + _.git/logs/HEAD | 1 + _.git/logs/refs/heads/trunk | 1 + _.git/logs/refs/remotes/origin/HEAD | 1 + ...06704623c6f502f1188ffe246bc5ef0196c18f.idx | Bin 0 -> 20840 bytes ...6704623c6f502f1188ffe246bc5ef0196c18f.pack | Bin 0 -> 96005 bytes ...06704623c6f502f1188ffe246bc5ef0196c18f.rev | Bin 0 -> 2876 bytes _.git/packed-refs | 2 + _.git/refs/heads/trunk | 1 + _.git/refs/remotes/origin/HEAD | 1 + compile_commands.json | 40 + ints | 0 kernel/.gitignore | 5 + kernel/GNUmakefile | 220 +++ kernel/get-deps | 80 + kernel/linker-aarch64.ld | 68 + kernel/linker-loongarch64.ld | 68 + kernel/linker-riscv64.ld | 70 + kernel/linker-x86_64.ld | 77 + kernel/src/font.h | 261 ++++ kernel/src/main.c | 124 ++ kernel/src/mm/memop.c | 59 + kernel/src/mm/memop.h | 13 + kernel/src/mm/pmm.c | 114 ++ kernel/src/mm/pmm.h | 28 + kernel/src/mm/vmm.c | 187 +++ kernel/src/mm/vmm.h | 41 + kernel/src/rt.c | 85 ++ kernel/src/rt.h | 41 + kernel/src/sched/sched.c | 111 ++ kernel/src/sched/sched.h | 39 + kernel/src/sys/arch/arch.h | 5 + kernel/src/sys/arch/x86_64/cpuid.h | 637 ++++++++ kernel/src/sys/arch/x86_64/gdt.c | 53 + kernel/src/sys/arch/x86_64/gdt.h | 37 + kernel/src/sys/arch/x86_64/idt.c | 44 + kernel/src/sys/arch/x86_64/idt.h | 51 + kernel/src/sys/arch/x86_64/interrupts.asm | 335 +++++ kernel/src/sys/arch/x86_64/interrupts.c | 70 + kernel/src/sys/arch/x86_64/io.c | 17 + kernel/src/sys/arch/x86_64/io.h | 19 + kernel/src/sys/arch/x86_64/pic.c | 76 + kernel/src/sys/arch/x86_64/pic.h | 23 + kernel/src/sys/arch/x86_64/pit.c | 60 + kernel/src/sys/arch/x86_64/pit.h | 17 + kernel/src/sys/arch/x86_64/rtc.c | 25 + kernel/src/sys/arch/x86_64/rtc.h | 6 + kernel/src/sys/arch/x86_64/sse.c | 59 + kernel/src/sys/arch/x86_64/sse.h | 4 + kernel/src/sys/log.c | 32 + kernel/src/sys/log.h | 3 + kernel/src/sys/printf.c | 26 + kernel/src/sys/printf.h | 1320 +++++++++++++++++ limine.conf | 12 + 264 files changed, 5833 insertions(+) create mode 100755 .cache/clangd/index/absvdi2.c.54DDD5ACC67061C6.idx create mode 100755 .cache/clangd/index/absvsi2.c.DA3C3A3D9E67C194.idx create mode 100755 .cache/clangd/index/absvti2.c.5F2C75A775CFB6CC.idx create mode 100755 .cache/clangd/index/adddf3.c.E12B9FA5FFF3A116.idx create mode 100755 .cache/clangd/index/addsf3.c.6A21188085DB5939.idx create mode 100755 .cache/clangd/index/addtf3.c.FFEE1EAA375AB63D.idx create mode 100755 .cache/clangd/index/addvdi3.c.264BD2D5F21DA659.idx create mode 100755 .cache/clangd/index/addvsi3.c.0CD1DD6CF6936A4C.idx create mode 100755 .cache/clangd/index/addvti3.c.9D846B9BFCBFA897.idx create mode 100755 .cache/clangd/index/ashldi3.c.6A223231E8170398.idx create mode 100755 .cache/clangd/index/ashlti3.c.B32287C6D4D707E3.idx create mode 100755 .cache/clangd/index/ashrdi3.c.F2CC32C875AE2BB1.idx create mode 100755 .cache/clangd/index/ashrti3.c.547C99831A12A8F7.idx create mode 100755 .cache/clangd/index/bswapdi2.c.3266AE3B38272DC9.idx create mode 100755 .cache/clangd/index/bswapsi2.c.6BA49B8A7292856C.idx create mode 100755 .cache/clangd/index/clzdi2.c.63FC64DE5751EBB0.idx create mode 100755 .cache/clangd/index/clzsi2.c.A37F2C92E88FF3A8.idx create mode 100755 .cache/clangd/index/clzti2.c.2A6BBD58CB8D70B2.idx create mode 100755 .cache/clangd/index/cmpdi2.c.FD632643048FD20D.idx create mode 100755 .cache/clangd/index/cmpti2.c.CC8B1B5751C62B11.idx create mode 100755 .cache/clangd/index/comparedf2.c.D2B72062E5C44781.idx create mode 100755 .cache/clangd/index/comparesf2.c.B9F43B600A274DEC.idx create mode 100755 .cache/clangd/index/comparetf2.c.F02E5BB1109C7844.idx create mode 100755 .cache/clangd/index/cpuid.h.018C95D9E7A01A9C.idx create mode 100755 .cache/clangd/index/ctzdi2.c.12B949AE9BD59CAE.idx create mode 100755 .cache/clangd/index/ctzsi2.c.D2E4645FDDB3AA58.idx create mode 100755 .cache/clangd/index/ctzti2.c.7FBB5DDBC32996D3.idx create mode 100755 .cache/clangd/index/divdc3.c.B02EEEA18AA404A6.idx create mode 100755 .cache/clangd/index/divdf3.c.7543317F59E8D2D2.idx create mode 100755 .cache/clangd/index/divdi3.c.6BDA5150A6EB1D65.idx create mode 100755 .cache/clangd/index/divmoddi4.c.82BCC30251D7E17A.idx create mode 100755 .cache/clangd/index/divmodsi4.c.239A327BFFA5B8B6.idx create mode 100755 .cache/clangd/index/divmodti4.c.00B492A2BA8BC858.idx create mode 100755 .cache/clangd/index/divsc3.c.BE681C46D41E1304.idx create mode 100755 .cache/clangd/index/divsf3.c.C99FF64B7B096BFB.idx create mode 100755 .cache/clangd/index/divsi3.c.DB00371C9235E262.idx create mode 100755 .cache/clangd/index/divtc3.c.A9DCC3E7BDEAF9BE.idx create mode 100755 .cache/clangd/index/divtf3.c.B111A0CECA5D3035.idx create mode 100755 .cache/clangd/index/divti3.c.44FFFC33CBBD7E11.idx create mode 100755 .cache/clangd/index/divxc3.c.905FFC7F29340495.idx create mode 100755 .cache/clangd/index/extendbfsf2.c.751092311FFC84C9.idx create mode 100755 .cache/clangd/index/extenddftf2.c.7ED44045BFB3B238.idx create mode 100755 .cache/clangd/index/extendhfsf2.c.03B8950D16847F43.idx create mode 100755 .cache/clangd/index/extendhftf2.c.60BD20BBE0925EBD.idx create mode 100755 .cache/clangd/index/extendsfdf2.c.10FA9150AAA23E1B.idx create mode 100755 .cache/clangd/index/extendsftf2.c.FBF219AE01DC013A.idx create mode 100755 .cache/clangd/index/extendxftf2.c.A63D2056E3253300.idx create mode 100755 .cache/clangd/index/ffsdi2.c.79C5DF073C096D49.idx create mode 100755 .cache/clangd/index/ffssi2.c.C81326D2B420BC3D.idx create mode 100755 .cache/clangd/index/ffsti2.c.10AE75FA4F6916A1.idx create mode 100755 .cache/clangd/index/fixdfdi.c.BAC876D4848A9BE1.idx create mode 100755 .cache/clangd/index/fixdfsi.c.905155CE468DF06C.idx create mode 100755 .cache/clangd/index/fixdfti.c.1C431C9BAAE04900.idx create mode 100755 .cache/clangd/index/fixsfdi.c.8E8BDEC974895892.idx create mode 100755 .cache/clangd/index/fixsfsi.c.85D5AA2B5053F0FC.idx create mode 100755 .cache/clangd/index/fixsfti.c.B78B16B87EA4D0FB.idx create mode 100755 .cache/clangd/index/fixtfdi.c.2BE7D60DD19558AA.idx create mode 100755 .cache/clangd/index/fixtfsi.c.7F527BC145B84F62.idx create mode 100755 .cache/clangd/index/fixtfti.c.11F9211E88441263.idx create mode 100755 .cache/clangd/index/fixunsdfdi.c.9DE83BF71DEA5831.idx create mode 100755 .cache/clangd/index/fixunsdfsi.c.8F6C0FA84A784C45.idx create mode 100755 .cache/clangd/index/fixunsdfti.c.EB752AFC1E65BD8E.idx create mode 100755 .cache/clangd/index/fixunssfdi.c.FBEE38152258EB25.idx create mode 100755 .cache/clangd/index/fixunssfsi.c.83C331E92668C640.idx create mode 100755 .cache/clangd/index/fixunssfti.c.3E5C1FE32DB42663.idx create mode 100755 .cache/clangd/index/fixunstfdi.c.7E0F2E026B8A0B3A.idx create mode 100755 .cache/clangd/index/fixunstfsi.c.56770C594F3637C0.idx create mode 100755 .cache/clangd/index/fixunstfti.c.38A7B9A9D0EA9E22.idx create mode 100755 .cache/clangd/index/fixunsxfdi.c.9A84D715BA17B381.idx create mode 100755 .cache/clangd/index/fixunsxfsi.c.64A80423C38553CD.idx create mode 100755 .cache/clangd/index/fixunsxfti.c.4F483535CE55842C.idx create mode 100755 .cache/clangd/index/fixxfdi.c.D44E12EDD8EBE9DD.idx create mode 100755 .cache/clangd/index/fixxfti.c.0DDFB1146255EA26.idx create mode 100755 .cache/clangd/index/float.h.625403E5DB9249DE.idx create mode 100755 .cache/clangd/index/floatdidf.c.7CD83C80C431B262.idx create mode 100755 .cache/clangd/index/floatdisf.c.5406E7EBA96B77CA.idx create mode 100755 .cache/clangd/index/floatditf.c.1801E16467493435.idx create mode 100755 .cache/clangd/index/floatdixf.c.6BB823913880BC0B.idx create mode 100755 .cache/clangd/index/floatsidf.c.B60844C3948DAD9D.idx create mode 100755 .cache/clangd/index/floatsisf.c.C8A64A1A3FD185DE.idx create mode 100755 .cache/clangd/index/floatsitf.c.202E46AB119C0745.idx create mode 100755 .cache/clangd/index/floattidf.c.683CB983AA96D16A.idx create mode 100755 .cache/clangd/index/floattisf.c.DCD4405D90466FEA.idx create mode 100755 .cache/clangd/index/floattitf.c.4564D8E4DCE26A5A.idx create mode 100755 .cache/clangd/index/floattixf.c.FD40D4766D0CDD61.idx create mode 100755 .cache/clangd/index/floatundidf.c.4B10E542023E51BA.idx create mode 100755 .cache/clangd/index/floatundisf.c.942666D3EDA3A6C0.idx create mode 100755 .cache/clangd/index/floatunditf.c.BB11B91A5C07D1D0.idx create mode 100755 .cache/clangd/index/floatundixf.c.852B821C51C856A5.idx create mode 100755 .cache/clangd/index/floatunsidf.c.1C1C214B3A3590BE.idx create mode 100755 .cache/clangd/index/floatunsisf.c.A55A87C94F7A1ADA.idx create mode 100755 .cache/clangd/index/floatunsitf.c.3F63253F59A658AC.idx create mode 100755 .cache/clangd/index/floatuntidf.c.4D25F6F2BFB083CE.idx create mode 100755 .cache/clangd/index/floatuntisf.c.E8791E75DCCA8ABC.idx create mode 100755 .cache/clangd/index/floatuntitf.c.724E7F8ABECFDFC1.idx create mode 100755 .cache/clangd/index/floatuntixf.c.EE53F7D637B2A573.idx create mode 100755 .cache/clangd/index/fp_mode.c.F75D5BE2C68790A2.idx create mode 100755 .cache/clangd/index/gdt.h.9C8AD8F8054C69EC.idx create mode 100755 .cache/clangd/index/idt.h.DDC5315D481C1E7B.idx create mode 100755 .cache/clangd/index/int_div_impl.inc.BD3EFF8675E59301.idx create mode 100755 .cache/clangd/index/int_endianness.h.5C1E934C459A2C11.idx create mode 100755 .cache/clangd/index/int_lib.h.D23BF2CC468A26AE.idx create mode 100755 .cache/clangd/index/int_mulo_impl.inc.30AD609D66153543.idx create mode 100755 .cache/clangd/index/int_mulv_impl.inc.3446C6A8D30A8A95.idx create mode 100755 .cache/clangd/index/int_types.h.C0E7CFD2C94C57DA.idx create mode 100755 .cache/clangd/index/int_util.c.CFBA7320024C669B.idx create mode 100755 .cache/clangd/index/int_util.h.B784D7EB2DFF7796.idx create mode 100755 .cache/clangd/index/io.h.2E7FA466828E882D.idx create mode 100755 .cache/clangd/index/limine.h.425D8D97D5109245.idx create mode 100755 .cache/clangd/index/limits.h.BEAC231889042657.idx create mode 100755 .cache/clangd/index/log.h.E0E90EDA1BF56D22.idx create mode 100755 .cache/clangd/index/lshrdi3.c.F40A6E4F6735AE96.idx create mode 100755 .cache/clangd/index/lshrti3.c.69AEAB488A42C507.idx create mode 100644 .cache/clangd/index/main.c.24DB0DF123881CD6.idx create mode 100755 .cache/clangd/index/moddi3.c.0937A263701885EE.idx create mode 100755 .cache/clangd/index/modsi3.c.24B72026862E98CE.idx create mode 100755 .cache/clangd/index/modti3.c.D1725B244F432BB4.idx create mode 100755 .cache/clangd/index/muldc3.c.8D2EEABC115A02E7.idx create mode 100755 .cache/clangd/index/muldf3.c.A521637959212EA2.idx create mode 100755 .cache/clangd/index/muldi3.c.6FFE6349D685208F.idx create mode 100755 .cache/clangd/index/mulodi4.c.7CFF50D1BA01B277.idx create mode 100755 .cache/clangd/index/mulosi4.c.2708019F9F2F0D0C.idx create mode 100755 .cache/clangd/index/muloti4.c.DC929331B0044080.idx create mode 100755 .cache/clangd/index/mulsc3.c.4410EACF80EF8370.idx create mode 100755 .cache/clangd/index/mulsf3.c.D8A52DEB227F4762.idx create mode 100755 .cache/clangd/index/multc3.c.4BB74172095852D7.idx create mode 100755 .cache/clangd/index/multf3.c.CB329698B6759894.idx create mode 100755 .cache/clangd/index/multi3.c.B4D485A74D27D73E.idx create mode 100755 .cache/clangd/index/mulvdi3.c.89FC644540984A34.idx create mode 100755 .cache/clangd/index/mulvsi3.c.25B42E22DE493BE9.idx create mode 100755 .cache/clangd/index/mulvti3.c.BC97F078FB8E2AB9.idx create mode 100755 .cache/clangd/index/mulxc3.c.C38AE5C45E3B1390.idx create mode 100755 .cache/clangd/index/negdf2.c.69F8A3ED6F115D2D.idx create mode 100755 .cache/clangd/index/negdi2.c.BB3C09D999057BB9.idx create mode 100755 .cache/clangd/index/negsf2.c.46A5F3CB8F7D8F7B.idx create mode 100755 .cache/clangd/index/negti2.c.2F8F06FD359C92A0.idx create mode 100755 .cache/clangd/index/negvdi2.c.A0002A18E7E2AEAD.idx create mode 100755 .cache/clangd/index/negvsi2.c.7C1011DBC19242A9.idx create mode 100755 .cache/clangd/index/negvti2.c.CCA4924AE800790B.idx create mode 100755 .cache/clangd/index/paritydi2.c.76303EDF321B5405.idx create mode 100755 .cache/clangd/index/paritysi2.c.73B893623308E5CD.idx create mode 100755 .cache/clangd/index/parityti2.c.6C41F097F0FB3C41.idx create mode 100755 .cache/clangd/index/pit.h.FCBDD7EB679035C0.idx create mode 100755 .cache/clangd/index/pmm.h.B0CABFB950313E4E.idx create mode 100755 .cache/clangd/index/popcountdi2.c.8F0CCB351D70021D.idx create mode 100755 .cache/clangd/index/popcountsi2.c.E33B79144AFF0E5F.idx create mode 100755 .cache/clangd/index/popcountti2.c.0F09C67FEBF85406.idx create mode 100755 .cache/clangd/index/powidf2.c.93DBC174A55353AA.idx create mode 100755 .cache/clangd/index/powisf2.c.E7998BCBE33C5284.idx create mode 100755 .cache/clangd/index/powitf2.c.BDF9DBAB7347A575.idx create mode 100755 .cache/clangd/index/powixf2.c.F04F47FDE1D34D1F.idx create mode 100755 .cache/clangd/index/printf.h.B451F1322E27C263.idx create mode 100755 .cache/clangd/index/rt.h.4DE1465D2E715A49.idx create mode 100755 .cache/clangd/index/rtc.h.EEC94DA1B55B20C6.idx create mode 100644 .cache/clangd/index/sched.h.E76F87C7BB1A08D8.idx create mode 100755 .cache/clangd/index/sse.h.508BF40E84B183FB.idx create mode 100755 .cache/clangd/index/stdarg.h.A9A08A3B143D24C3.idx create mode 100755 .cache/clangd/index/stdbool.h.0693D9FEB5499621.idx create mode 100755 .cache/clangd/index/stddef.h.DD16386422A95BDA.idx create mode 100755 .cache/clangd/index/stdint.h.465D5E9EFF387506.idx create mode 100755 .cache/clangd/index/subdf3.c.7B4DE2500F85491F.idx create mode 100755 .cache/clangd/index/subsf3.c.B8379285A8FB1003.idx create mode 100755 .cache/clangd/index/subtf3.c.2A1CE141BC778302.idx create mode 100755 .cache/clangd/index/subvdi3.c.36C79223A475F797.idx create mode 100755 .cache/clangd/index/subvsi3.c.A5D87882A951E5E7.idx create mode 100755 .cache/clangd/index/subvti3.c.829111C90A78F5E3.idx create mode 100755 .cache/clangd/index/truncdfbf2.c.5C4053C67A050699.idx create mode 100755 .cache/clangd/index/truncdfhf2.c.3A5024083614A0CD.idx create mode 100755 .cache/clangd/index/truncdfsf2.c.A03358D45B4ED38F.idx create mode 100755 .cache/clangd/index/truncsfbf2.c.62ADA672DACBA367.idx create mode 100755 .cache/clangd/index/truncsfhf2.c.3FFEF4DC19E99F2E.idx create mode 100755 .cache/clangd/index/trunctfdf2.c.FD9D1EAC94E4DA09.idx create mode 100755 .cache/clangd/index/trunctfhf2.c.D2EAB4EF390B11D1.idx create mode 100755 .cache/clangd/index/trunctfsf2.c.B377EBF78748EF30.idx create mode 100755 .cache/clangd/index/trunctfxf2.c.19981BF10FD2F99E.idx create mode 100755 .cache/clangd/index/truncxfbf2.c.F9E9DA66F162327F.idx create mode 100755 .cache/clangd/index/ucmpdi2.c.084AEC36084D5BB3.idx create mode 100755 .cache/clangd/index/ucmpti2.c.8E1052AFD84404FD.idx create mode 100755 .cache/clangd/index/udivdi3.c.561304CA1C1BE0E9.idx create mode 100755 .cache/clangd/index/udivmoddi4.c.70F2B64E31B6BC69.idx create mode 100755 .cache/clangd/index/udivmodsi4.c.8138533E2886502D.idx create mode 100755 .cache/clangd/index/udivmodti4.c.46DA76158F034612.idx create mode 100755 .cache/clangd/index/udivsi3.c.B3F1B82AE31AA297.idx create mode 100755 .cache/clangd/index/udivti3.c.E62428D445E7E7BF.idx create mode 100755 .cache/clangd/index/umoddi3.c.08FC9E378DFD72A1.idx create mode 100755 .cache/clangd/index/umodsi3.c.7A9476DD12568553.idx create mode 100755 .cache/clangd/index/umodti3.c.DB9DB5C81AF2F756.idx create mode 100755 .cache/clangd/index/vmm.h.3958D0C383864F44.idx create mode 100755 .gitignore create mode 100755 GNUmakefile create mode 100755 LICENSE create mode 100755 README.md create mode 100755 _.git/HEAD create mode 100755 _.git/config create mode 100755 _.git/description create mode 100755 _.git/hooks/applypatch-msg.sample create mode 100755 _.git/hooks/commit-msg.sample create mode 100755 _.git/hooks/fsmonitor-watchman.sample create mode 100755 _.git/hooks/post-update.sample create mode 100755 _.git/hooks/pre-applypatch.sample create mode 100755 _.git/hooks/pre-commit.sample create mode 100755 _.git/hooks/pre-merge-commit.sample create mode 100755 _.git/hooks/pre-push.sample create mode 100755 _.git/hooks/pre-rebase.sample create mode 100755 _.git/hooks/pre-receive.sample create mode 100755 _.git/hooks/prepare-commit-msg.sample create mode 100755 _.git/hooks/push-to-checkout.sample create mode 100755 _.git/hooks/sendemail-validate.sample create mode 100755 _.git/hooks/update.sample create mode 100644 _.git/index create mode 100755 _.git/info/exclude create mode 100755 _.git/logs/HEAD create mode 100755 _.git/logs/refs/heads/trunk create mode 100755 _.git/logs/refs/remotes/origin/HEAD create mode 100755 _.git/objects/pack/pack-2706704623c6f502f1188ffe246bc5ef0196c18f.idx create mode 100755 _.git/objects/pack/pack-2706704623c6f502f1188ffe246bc5ef0196c18f.pack create mode 100755 _.git/objects/pack/pack-2706704623c6f502f1188ffe246bc5ef0196c18f.rev create mode 100755 _.git/packed-refs create mode 100755 _.git/refs/heads/trunk create mode 100755 _.git/refs/remotes/origin/HEAD create mode 100755 compile_commands.json create mode 100644 ints create mode 100755 kernel/.gitignore create mode 100755 kernel/GNUmakefile create mode 100755 kernel/get-deps create mode 100755 kernel/linker-aarch64.ld create mode 100755 kernel/linker-loongarch64.ld create mode 100755 kernel/linker-riscv64.ld create mode 100755 kernel/linker-x86_64.ld create mode 100755 kernel/src/font.h create mode 100755 kernel/src/main.c create mode 100755 kernel/src/mm/memop.c create mode 100755 kernel/src/mm/memop.h create mode 100755 kernel/src/mm/pmm.c create mode 100755 kernel/src/mm/pmm.h create mode 100755 kernel/src/mm/vmm.c create mode 100755 kernel/src/mm/vmm.h create mode 100755 kernel/src/rt.c create mode 100755 kernel/src/rt.h create mode 100755 kernel/src/sched/sched.c create mode 100755 kernel/src/sched/sched.h create mode 100755 kernel/src/sys/arch/arch.h create mode 100755 kernel/src/sys/arch/x86_64/cpuid.h create mode 100755 kernel/src/sys/arch/x86_64/gdt.c create mode 100755 kernel/src/sys/arch/x86_64/gdt.h create mode 100755 kernel/src/sys/arch/x86_64/idt.c create mode 100755 kernel/src/sys/arch/x86_64/idt.h create mode 100755 kernel/src/sys/arch/x86_64/interrupts.asm create mode 100755 kernel/src/sys/arch/x86_64/interrupts.c create mode 100755 kernel/src/sys/arch/x86_64/io.c create mode 100755 kernel/src/sys/arch/x86_64/io.h create mode 100755 kernel/src/sys/arch/x86_64/pic.c create mode 100755 kernel/src/sys/arch/x86_64/pic.h create mode 100755 kernel/src/sys/arch/x86_64/pit.c create mode 100755 kernel/src/sys/arch/x86_64/pit.h create mode 100755 kernel/src/sys/arch/x86_64/rtc.c create mode 100755 kernel/src/sys/arch/x86_64/rtc.h create mode 100755 kernel/src/sys/arch/x86_64/sse.c create mode 100755 kernel/src/sys/arch/x86_64/sse.h create mode 100755 kernel/src/sys/log.c create mode 100755 kernel/src/sys/log.h create mode 100755 kernel/src/sys/printf.c create mode 100755 kernel/src/sys/printf.h create mode 100755 limine.conf diff --git a/.cache/clangd/index/absvdi2.c.54DDD5ACC67061C6.idx b/.cache/clangd/index/absvdi2.c.54DDD5ACC67061C6.idx new file mode 100755 index 0000000000000000000000000000000000000000..c7fe8a2a636bbb4d822bc7f6d2b533dc43ef3e65 GIT binary patch literal 742 zcmWIYbaT7M#K7R3;#rZKT9U}Zz`!63#Kk2=nF)*x3_F2x6?2wO$oFS5`ewMy8e zOYQri1!^i>M-pl(C8Hl|{Vu*)#`5QjSX#^WtW75Vw{4^AMH!gnjy-<%HFwvHJvL^S zBR_w!*&WX@gO_!WcDCgsJ$F?H?g+`LqAFKrHu=w4uatD^l=P?9&bNLizy8z3Z!o{7 zdxNFOLAkw*cNg88Bfd+*$lCeIqiI6ACxh-?*OhFJW2kq`oNr{s`0iI%bJwo5<%_c| z(r&RfZ@ZW9{Y|$fKI`=$(&j0`a56jOxAF5V|)i9o|f38wonVTdJ4DZVuU*7uB z!8M(SL79O;RY+V&0Zag8AfPBUt@tL8Ige%iVJ|ibE=C?z5it=Nn6|>_iF*PkN=UHs zs0s-PiNS<{JVhaO1W#C2SQ)_+;S~`^@WeR8_+Y%VU-SZG#dH)ISyV+?L`7i2R*URr z*zGd$1zHXghPkbvu*ScpN0A0`ab#mI%?m2>Z;!z7#i=K@s=s|)MHR5KK% z<|KkR#YM@*;y{{FwQrH61m_Cd1V%LmHMlZ{`ewMy8e zOYQri1!^i>M-pl(C8Hl|{Vu*)#`5QjSX#^WtW75Vw{4^AMH!gnjy-<%HFwvHJvL^S zBR_w!*&WX@gO_!WcDCgsJ$F?H?g+`LqAFKrHu=w4uatD^l=P?9&bNLizy8z3Z!o{7 zdxNFOLAkw*cNg88Bfd+*$lCeIqiI6ACxh-?*OhFJW2kq`oNr{s`0iI%bJwo5<%_c| z(r&RfZ@ZW9Q;7I>9qXdr1#|qHlH-z z&1cc9{jGc1&uty@*`i0fbnbcnod5s-AC{kYK2)s^t6_Y%@_9mWWp0u@FuWU1YR2!J zBBj8?pv=IaDkLtX049Jk5KxqwR(uo4gsEfXLXkiFMK3^BOh=KCMOBnVR0O8VYLVRx zyIm%}j67grm|+ElU7n4iUxI+bLJUIuFk$9LS=nc+5B39vMZ`p8V1}G~Cmkl)>^~PM zEUYf94^v$z?e~15(8VjPKtlwC#9*p{JVhaO1W#C2SQ)_+;S~`^@WeR8_+UJSqSTy3 zklDpW$;IM8no;%G%EGm-CNJMGsxhd+Y-M0b&P~bD267cNmH3&ZSy<&HIe2-vIN1e- dL`20U#DrN`Wq|_Roa}r8@=R<}Dl&|U3;>K-|H=RW literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/absvti2.c.5F2C75A775CFB6CC.idx b/.cache/clangd/index/absvti2.c.5F2C75A775CFB6CC.idx new file mode 100755 index 0000000000000000000000000000000000000000..f7da3329b2e8209d39ede7659db6ad46c5e6be44 GIT binary patch literal 764 zcmWIYbaVT{#K7R3;#rZKT9U}Zz`!63#Kk2=nemJa3_F2x6?2wO$oFP8`cwW!qU znaI0VA6Cb?9gj{gzMfWI__uh=-ojrm&xQrwUlnj@@)G~q@hlAur?0N6tl3w;Yv=B) zch}E;ef#T?=Yd}l2f8;+Q}(meVvIU)Y{eRdh3799tE4SyjDz=?DC$MwJVi(=WQ~9O-#}BIF7Zef^6_*ebW?_{D3UG6>^9jf^u}P`OFe)+t0PXG!g8%>k literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/adddf3.c.E12B9FA5FFF3A116.idx b/.cache/clangd/index/adddf3.c.E12B9FA5FFF3A116.idx new file mode 100755 index 0000000000000000000000000000000000000000..5458c3b55a1d3655a18e807cfd5d327a982c10bb GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$Rac!wp*bAu&1#OE|yj;>`b~iSMCCQepPw%ur+FKFA@Xz5-<_iO0@U&Re?;oq} z^6j}^t?QT9_2ZVo`j)|`Foq(IDF_CVL8C+x5K$)WU8KATh%pJLv};f4;Lfe<5$9pE zTx4OA&w@O153)nKzb^E_Cvy5g#es?$oLV?a;nc#H`x13Q~i5J7g;IG@2e zlh!LV)gFUGTHMmT^P9>1E=z02ECMR{_6~Cv<3$j&^Dz+(!P2U|?x`6t`XNXJr9;Js z7`V|pZp^{*@}BRs<3({fr=B#zwbW$9r7BsLS+s5-Ni+G|oB|1*3X$>7TjW9Xo#mV0 zzc57}wNX5ya48`SE@_KEur^-}%C` zMjL$K{2y=r0JMk7jB|NyVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$Rac!wp*bAu&1#OE|yj;>`b~iSMCCQepPw%ur+FKFA@Xz5-<_iO0@U&Re?;oq} z^6j}^t?QT9_2ZVo`j)|`Foq(IDF_CVL8C+x5K$)WU8KATh%pJLv};f4;Lfe<5$9pE zTx4OA&w@O153)nKzb^E_Cvy5g#es?$oLV?a;nc#H`x13Q~i5J7g;IG@2e zlh!LV)gFUGTHMmT^P9>1E=z02ECMR{_6~Cv<3$j&^Dz+(!P2U|?x`6t`XNXJr9;Js z7`V|pZp^{*@}BRs<3({fr=B#zwbW$9r7BsLS+s5-Ni+G|oB|1*3X$>7TjW9Xo#mV0 zzc57}wNX5ya48`SE@_KEur^-}%C` zMjL$K{2y=r0Ki?!xpR4KVgLXD0CHt!a{vGU0CHt)VE_OC0CRFt<8 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/addtf3.c.FFEE1EAA375AB63D.idx b/.cache/clangd/index/addtf3.c.FFEE1EAA375AB63D.idx new file mode 100755 index 0000000000000000000000000000000000000000..406efa2c9fcfc8a44a9d7ea9e751676781d19295 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$Rac!wp*bAu&1#OE|yj;>`b~iSMCCQepPw%ur+FKFA@Xz5-<_iO0@U&Re?;oq} z^6j}^t?QT9_2ZVo`j)|`Foq(IDF_CVL8C+x5K$)WU8KATh%pJLv};f4;Lfe<5$9pE zTx4OA&w@O153)nKzb^E_Cvy5g#es?$oLV?a;nc#H`x13Q~i5J7g;IG@2e zlh!LV)gFUGTHMmT^P9>1E=z02ECMR{_6~Cv<3$j&^Dz+(!P2U|?x`6t`XNXJr9;Js z7`V|pZp^{*@}BRs<3({fr=B#zwbW$9r7BsLS+s5-Ni+G|oB|1*3X$>7TjW9Xo#mV0 zzc57}wNX5ya48`SE@_KEur^-}%C` zMjL$K{2y=r0Kq59ymNVNVgLXD0CHt!a{vGU0CHt)VE_OC0CRF`ewMy8q zOYQri1!^i>M-pl(C8Hl|{Vu*)#`5QjSX#^WtW75Vw{4^AMH!gnjy-<%HFwvHJvL^S zBR_w!*&WX@BbKWo{94hG*gmfYu?;8WWLw3&%XP1%eu-g9S=))Dx~fr=mhM>}ZN#>h;a}4wyVMe2ckjU$6WPoEynB&ku}kyP&R9V~-Ws-kRqvN7Gj6s|nc0?Dd8N-P&&_9Hztq8i zHL3F#ZP_yATHailJEv4DBSV)LzsOwuXV&bdojz;Xo0YEZOFvnD>ee1c-nE^cC(JCS z1eUIy{8_@zKz-&3smOpO*95BPpHwu+IlN(inMdlGYZo?LdejlH>O$s*C%_JyIiGB-&c7~aqC{eGw1 zHPxAiL79O;RY+V&0Zag8AfPBUt@s|0Ige%iVJ|ibE+!sTVLo9IxHeT`DPaW|ukd-| zp1_F`5-dEbLIOf!Fkv81QAiz$r!8cN;0ZGcbHI3Kzvujav8al%iNOtEQI%wq zg!5pE8M#oLYPHC2hTSd`U!V&?dSM>m0qceF3JSYC8%4haF#_GhAjA(7E=tWw1hI>Y zl8ePb3^fn|28^of-{~t(?UkCusK$_-o06jq6jsnw;%Am-VU?5Q;N{`sWET_?5fzsZ Z6J}wR1qyI;vhxYZGqFjj$S^80008HZ4w(P| literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/addvsi3.c.0CD1DD6CF6936A4C.idx b/.cache/clangd/index/addvsi3.c.0CD1DD6CF6936A4C.idx new file mode 100755 index 0000000000000000000000000000000000000000..f6341b53b878ccdedfe843508ad4913800cc2ae6 GIT binary patch literal 746 zcmWIYbaQ*e#K7R3;#rZKT9U}Zz`!63#Kk2=nemJa3_F2x6?2wO$oFS5`ewMy8q zOYQri1!^i>M-pl(C8Hl|{Vu*)#`5QjSX#^WtW75Vw{4^AMH!gnjy-<%HFwvHJvL^S zBR_w!*&WX@BbKWo{94hG*gmfYu?;8WWLw3&%XP1%eu-g9S=))Dx~fr=mhM>}ZN#>h;a}4wyVMe2ckjU$6WPoEynB&ku}kyP&R9V~-Ws-kRqvN7Gj6s|nc0?Dd8N-P&&_9Hztq8i zHL3F#ZP_yATHailJEv4DBSV)LzsOwuXV&bdojz;Xo0YEZOFvnD>ee1c-nE^cC(JCS z1eUIy{8_@zKz-&3smOpO*95BPpHwu+IlN(inMdjwvx^%pJ?aQpbs=-Zli#u*a*EEb zV?Otw>+hn>eY%g1N3m{H>MjrZ_x!)Ty`!D^o_niA<1g=gZop7nnVTdJ4DVMDc(-x7 zd!6B7P-b9I6%rRx024qN2q;QTE4~M0p8cX1ASLj+HlNtgr1D@x5t1UaO* zD7jc1#83kfV8Ezq(@}piWK%ISqZ&hUZc2_eP*_1ziJw`Tg;h?HgO`VklU-0qL{wZt ZOqhjL7AU~Y$<8Mr&%`FBBEzW2002NR104VW literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/addvti3.c.9D846B9BFCBFA897.idx b/.cache/clangd/index/addvti3.c.9D846B9BFCBFA897.idx new file mode 100755 index 0000000000000000000000000000000000000000..ec6f6f6838670a326236e1eb6d1b2c1cc9bc887d GIT binary patch literal 770 zcmWIYbaVT~#K7R3;#rZKT9U}Zz`!63#Kk2=nemJa3_F2x6?2wO$oFS5`ewMy8q zOYQri1!^i>M-pl(C8Hl|{Vu*)#`5QjSX#^WtW75Vw{4^AMH!gnjy-<%HFwvHJvL^S zBR_w!*&WX@BbKWo{94hG*gmfYu?;8WWLw3&%XP1%eu-g9S=))Dx~fr=mhM>}ZN#>h;a}4wyVMe2ckjU$6WPoEynB&ku}kyP&R9V~-Ws-kRqvN7Gj6s|nc0?Dd8N-P&&_9Hztq8i zHL3F#ZP_yATHailJEv4DBSV)LzsOwuXV&bdojz;Xo0YEZOFvnD>ee1c-nE^cC(JCS z1eUIy{8_@zKz-&3smOpO*95BPpHwu+IlN(inMdjwv&$PUJ?aQpbs=-Zli#u*a*EEb zV?Otw>+hn>eY%g1N3m{H>MjrZ_x!)Ty`!D^o_niAfr6G@QrxcD0K#qmuu7qlA{geDrhS4GfT6u n%1LtY@^Epo3kr#dic5$Iv#`nn1-Loc`2^&d*rZfs7!?@+Y2P5I literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ashldi3.c.6A223231E8170398.idx b/.cache/clangd/index/ashldi3.c.6A223231E8170398.idx new file mode 100755 index 0000000000000000000000000000000000000000..513e79b4d5328341768f1b4b904b94acac5067f1 GIT binary patch literal 1002 zcmWIYbaQ*e%)sEB;#rZKT9U}Zz`!63#Kk2=nemJa3_F<^7%Jv0osjR%Y{+x$cWcqt zk{2THT76g@?+P59?tVS3yzp=F7TcXaU!DyMyuT{o(Bvilv*TGB8de`&R9jP5v1{-C zJo#yF&))s?$@9Rchy&f5rYZYbYB5F~IJRPq!oqVRHIHh91%t!xO?dz9owy)lvKP2FsmfjIlv)Cnj)0A>w|6>cp55x!DTH52+U_G}mAn^NH z6Z=-@Ww8bsvvuA2ZFW2^f9|gSd9%{o*NT{h!E+7Xds zD+GCty7g&#d1q(7ojv*M&X~#5L%-I3v(26Qeuw6a(3rzwn2g zP082gme1Q5zvb<6*P6)H3T7!EolgD#^Z&W}iRaUIpeQ?x;l}A;AS3&?L%%dtPBPoyI$@0n~ z$;nE~$|2Wa1VT<;S6&asV}6vCeYW~wKhQn$T=H-)oO>r7 zCfV#i7bq-jBy0t9rpSq$;N-Q*SD1kgy)bD;E|ds-sdt>ycjCp5z$g)665)WU;!zc45{2^^ic)hDK~5?zN-h=$(u}H) zYHF>RC*DnFRAW$sIhKJTIX5Lo8^~4ARN`lrW?_|+owy)lvKP2FsmfjIlv)Cnj)0A>w|6>cp55x!DTH52+U_G}mAn^NH z6Z=-@Ww8bsvvuA2ZFW2^f9|gSd9%{o*NT{h!E+7Xds zD+GCty7g&#d1q(7ojv*M&X~#5L%-I3v(26Qeuw6a(81+$coPN)9=`Ttz~#Pey_qrX04e%1Iqf}yxFH%T5C-i%Y0 z72I0+;{y+aG6RFEh`5LXm;lN^Kv8O1@fToxOm(R{)fL9b$i$;6A|N6L*QP3>D54JI z&0|@A*o#eqi;+iFkxNkkCS3SDaZlhx2??OEsHUhsOqlQOY8PcjCkvo3A3L8Y%*Llq z^Q}v7lsdBVs7mol!42V2m6nl~hw0@}mFJa5l9QK~mqW-Y>MI(-cm;)Bo{gekf`GP& zFo^KOY&l~1>d1jDtCNBLk>HTvhN<4?|VHQ?dpa3@~JD-3&6PuKZ45K0g0Kq(s>;M1& literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ashrdi3.c.F2CC32C875AE2BB1.idx b/.cache/clangd/index/ashrdi3.c.F2CC32C875AE2BB1.idx new file mode 100755 index 0000000000000000000000000000000000000000..2488400b1b7f27f1d487f079114aa3e3da623b56 GIT binary patch literal 1030 zcmWIYbaVU1%)sEB;#rZKT9U}Zz`!63#Kk2=nemJa3_F<^7%Jv0osjR%Y{+x$cWcqt zk{2THT76g@?+P59?tVS3yzp=F7TcXaU!DyMyuT{o(Bvilv*TGB8de`&R9jP5v1{-C zJo#yF&))s?$@9Rchy&f5rYZYbYB5F~IJRPq!oqVRHIHh91%t!xO?dz9owy)lvKP2FsmfjIlv)Cnj)0A>w|6>cp55x!DTH52+U_G}mAn^NH z6Z=-@Ww8bsvvuA2ZFW2^f9|gSd9%{o*NT{h!E+7Xds zD+GCty7g&#d1q(7ojv*M&X~#5L%-I3v(26Qeuw6a(3rzwn2g zP082gme1Q5zvb<6*P6)H3T7!EolgD#^Z&W}iRaUIpeQ?x;nMYNMS4sdT%%dvLE04rea8PiD z$rTiKc{YlE31S4A#2~~EbKCYgKRbV>MwW5%s7i86^1xIBc~X+n2%Z$T6q1~jq?8mw zPL5j+Nls2m4oROpw>*-Zg1CYNLZ5=2f<27K{3t8?Z1ur@pz9R46yRQfNi%Yxgy^|< z(qWR#{&Rt~OyYuJEvtfbvR|OoJyu^QYJWE5v>Z6NlYw9X??cJXz zKke<=yPrOJ9{3b-pnKCaWj{+T#;60wR;*E2cuu6|QH`)*aM-;G@4vl#!M}EXcum9A zw~IJtI}5(K7=6L^)!Xxj1f0{-J7Q`UyJT;gQts=2Y=QWJ_<&nWd;A)#=N1M8em`qs z-|D<9)*xfHu3Nv&j>qNC-PJ#DR+>Azt0UuqZG}#x*ZroMwH`AwC8oK{W;{qcB64hn zAkR^^K20z0?98{bCx6`;GkJRG*V=Ekxl`Zo(42AFWY@ax7k^GndOu}rC9_nO@Z<@# z1saQ`s?@^`_ayllO*GxKz+)%e$`f7ODbLmmWg&~O-5>ECDf5_RC zd|ht&yp8c&-Y$2oiCnE;YJD6Y&+k_U!&V#d@n zDREV&c^H%#7*s{XMHIjUPzC~uQqzhBfN?R^rS4Q$7$YMSkE)1(h!|X(s)(Y9I*d1u zW&L3|Xl;q$~jffFSpfWo4hqWUmlzPGDglo_2YfWmz2e4;QLpE}LA zF1=Ce$jqZE!z%+fghy48R}qP)D!-QAHG~y zInVri|L57^jGv1c-=B)=+i^CK^8!9PmH&sTTM*z~EbX170kea76lkBnmc zo0W3-TsOF{cPw9VeR->0+nI9$J9jK}@!mA0ywv^J0`UX>0k@X+_%+P#v0SlYca`YwV!m&S&L^z^}D%lsY^InerkIqvy_$ax!~#_5xF zZ-28{Y{)O*`}wh;d$H(|E}b~-AWgws^HLW-p$b_k5qb C*4W4Z literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/bswapsi2.c.6BA49B8A7292856C.idx b/.cache/clangd/index/bswapsi2.c.6BA49B8A7292856C.idx new file mode 100755 index 0000000000000000000000000000000000000000..2661a2c1acc76f0e489445758ba5b53f1bbf999d GIT binary patch literal 610 zcmWIYbaRVhVqkDi@vO*AElFfyU|D!-QAHG~y zInVri|L57^jGv1c-=B)=+i^CK^8!9PmH&sTTM*z~EbX170kea76lkBnmc zo0W3-TsOF{cPw9VeR->0+nI9$J9jK}@!mA0ywv^J0`UX>0k@X+_%+P#v0SlYca`YwV!m&S&L^z^}D%lsY^InerkIqvy_$ax_hQi_T{>~zKi7-?vuUo$`_aAHuZH=A^h*_n;>z44d0>cty?lCY zSxrzh4}&rTgDRgSpE8&L%0NI-YFcqHkXcaJ<=H6uC5Vwnm5+gsA0`dc&d7zLjcd(^ zvo^E-J!1l@7T}YBsRHs;_;g@AhN9G*M36znMajkDAch)<00TzVn(BfdGbMfE7}Xe( zb5nA(fx-%!O8m^yEUa>p9K1YSoa}-^BBJ6FV!|w}vOocDPIf*4c_ua~6&XfF1^^FP B;JN?+ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/clzdi2.c.63FC64DE5751EBB0.idx b/.cache/clangd/index/clzdi2.c.63FC64DE5751EBB0.idx new file mode 100755 index 0000000000000000000000000000000000000000..b77216666e1bd1a13a25e23f82ad34e37978e9ec GIT binary patch literal 846 zcmWIYbaQiKW?*nm@vO*AElFfyU|9;hPPpyGY$(w7*=h5} z&@9n!POF?8Z!3xFPtP^FD?9t}q?FU!{NHbJe6^NK@lWv&_0O&h92IlUuG;?nXw|=8 zA-dD9em?yvQ8&R->_edRVRJssD@;=w)~*ZY6%18+uXOx&gGBIKlbz2*zP*e2b@P$U znrEAJd_F~PaDVHtbw!!IaO{W9xpoCb{u9koG-OXr+v29)Fn>Ws2j^M_>zxl*^R3ct zf5~!g;-bdS>1rVG1W#2OQ|+x~8CF1N~(68D5Ssa+$4EmX!mnP2}>Wj zbB~8XnSnu7MnpyiOaNsdpeQx1*clibtL{m-t_n>SW#mznW07NrX)Ao5xF>L;galAn zMpi}{CVcGe^~Q1lA@-fA{(` xAXh>ff&r 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ctzdi2.c.12B949AE9BD59CAE.idx b/.cache/clangd/index/ctzdi2.c.12B949AE9BD59CAE.idx new file mode 100755 index 0000000000000000000000000000000000000000..d2baa97791fc357d31c54940b144b24d77ddb545 GIT binary patch literal 846 zcmWIYbaQiKW?*nm@vO*AElFfyU|9;hPPpyGY$(w7*=h4e zt*F+$6ILl?L@#;tbkkg)-O0rflX5bDfAN!c$q(gtIRCKyOnokggMU*l?b+um?yt{( zw&a?P-T8N7Txrj_?nP%mT^8H7mMLU|QEr~1U>cvD=bkPX&F%L##LFK(IN!@Yx~Adh z?WqIwXCn7smd+)r}5xZA9 z{-CClIM2;0=Zlkd-le?z@g}Jzc1iJWB_&A<7JpT*m(d)X`8BzF51d+M`#q><${~S? z2MX4Fov>)zo-5b#=E~iDp;{dqdjENZ^X*?-MWzP+uX~aCG0fR=iZQt4KPtUaxlG&h3PiOoAt6%pAUYhY<=YtFzJGF#J9tIDW-eH zE>BETIlE%kGK(wIH*#eiotC%t-|@%w^A6aVf7%+l+>TLK=;@B)%G@M*U}(<^&bd+h zCha5-gE9kys*H$?4444QKtNGyTCp=QHmta9Wf~_u;$h@bRp3x0jVTPjAoJ5c#ii?tq#ep=VD!-nV{_XYRGK^{rYB1+9FeK-u z{5vtOwC7y+qO+eai|t#>6tcl6H&0P8jnB?=PnV14_In%R0YtR z6Vp`Au9&sV;>z@mTvKM6DSBJR3#71Tpfc3NZ-r!*nq}%E~@l zeXyUIM^%_fm;gh>Rhs3=&e`Z8PyonV74ZccVS0eL1iDHRz;MFs#ShV9t^ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ctzti2.c.7FBB5DDBC32996D3.idx b/.cache/clangd/index/ctzti2.c.7FBB5DDBC32996D3.idx new file mode 100755 index 0000000000000000000000000000000000000000..f59de5d0eb0573b205a482f6f931692093227e4b GIT binary patch literal 868 zcmWIYbaRVgW?*nm@vO*AElFfyU|9;hPPpyGY$(w7*=h4e zt*F+$6ILl?L@#;tbkkg)-O0rflX5bDfAN!c$q(gtIRCKyOnokggMU*l?b+um?yt{( zw&a?P-T8N7Txrj_?nP%mT^8H7mMLU|QEr~1U>cvD=bkPX&F%L##LFK(IN!@Yx~Adh z?WqIwXCn7smd+)r}5xZA9 z{-CClIM2;0=Zlkd-le?z@g}Jzc1iJWB_&A<7JpT*m(d)X`8BzF51d+M`#q><${~S? z2MX4Fov>)zo-5b#=E~iDp;{dqdjENZ^X*?-MWzP+uX~aCG0fR=iZQt4KPtUaxlG&h3PiOoAt6%pA|n>w!U%+m~=ro;@e@q6w|$8 zmnWvFoLw<%nZ=dq8@aNMPRrZ+@A%{Tc?aywKWze$OWgUAzKxoFuoTAWSuo zCm|^Z<8dW*%5Pe7=M7M=gq(yDO!ze8az3*&9v^|iqD-P3FyW%qoJ5fE#YM@*;y{{F zRXV-m|N6M*4UB3GYA}l#7?N{SaW@#2yIY|y)9xhIHK_L-QaS1VD7FJoH T05>N)pMX3Qo0N(Sqap(UnT9eo literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divdc3.c.B02EEEA18AA404A6.idx b/.cache/clangd/index/divdc3.c.B02EEEA18AA404A6.idx new file mode 100755 index 0000000000000000000000000000000000000000..5846b323b20caf13ac40c209719248d75c88930a GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$xxVF?P?1fZ?g0@8}UM|~Yx;r+9CCQepPw%ur+FKFA@Xz5-=8FIj@HC%S?;p#} z;_bOwuBw;U)#FCM>Q=yKZ45^oQm6$e0Xto%8X~Gh-bK!L0Wqf9X>!de?cKR`J>op9 z7xOGk@>#G)?LoDu_Sc0j_{2^hxOkvQTQZc6WlLJ46TnYUJjR4pfSpb_)Iqi7Fq^_T zQ`T!V zjto9X`Hwe$0LLZD(Q|oiVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAL0ssJboTZT4Y63A3 zhVw#WY87h>dr@o)LaS0Ny_A^D?oQ2NNwT7S`i_R8x1|tuve`M4IaycO`NtmTM@9F+hqpf)NiNT@RfpE$20V#>-J^35sj{ke5L;sdPa zvm$H`MX*QjK)0xO*M%;I%+3(GxTi#0vXqZiOU9rVz)w&*ri@O2n~XWAsN3o=oxnNM zE*P}c4x>k2-0{8Bo6+>HNaqekL^SXnJeDk_i(qCSQf3;4(2+!V}ZDm@$)(fFPv&y;WT1~jxLCL!D4P)60YPOf73 z!klCxYh*!@T0`u8CWpYV8;1R}LmJwfdNk1DOi+r@X|Uw`1Mq6HVbh6bIA*)}ogV~I zlf?%q|MBJz$$HA#0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFA>#_S5gnF-{k6 z*uQk^p4qj1LII5Hww@8195}Pd|IGD^Go~!P{={5a_RqqvA3OLf_RkPcDAs5&&FWrd zob`L-h2s+r)0QJ`{aFj;F3FKuuzTMlU$?8Kzh9cl%_wq|zMbRy zrLEU`p7q}%%e|TxcGfap%=ja`M^k5M`GJ|W9y2c&L~OeieEw`kki;UR6`E#A9)S^2 zoZ01mSK^O$?OCzvyXm(nQ|k`BSQ>la7(dTXpP#vLix2r7XIaF3u0!MZxz67b z^L+i3CSG0SBIuPUQ=^tX;qW$@Z}UZ+F8f_hUHV|c0+Eg387KLxQ?io|FEaG4JzA7; zdl7?av_qv~!JI(Wh{>kLigphl?^oY2`C_#9y6smhLg&vq@;$WlgZP85!mElabCVQ- zu~e{v)uNH%DF+XODg%S2sJN)Swu`unJOd{aBZImcqc$r;QEFOo1(HfeF0eA72pAMT zPuvqYQ9^>5M^jWlR19vOrl^9b8WK-S)BwgSDD3iV6#Wv!2-LzL$`3PXw^p8D4a@hx zAYofkSD5Oe)SN_+lH#J|Vr39R3q*hcqvpDt#JOq3)|^b*S`6ASVFrfe+>{&;S4mSv skX4qAT|t_QpO1%|Q&>byTvAFxl#N{;D8S3jDIlcC!Xcv}$E?f%0H^H*RR910 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divmoddi4.c.82BCC30251D7E17A.idx b/.cache/clangd/index/divmoddi4.c.82BCC30251D7E17A.idx new file mode 100755 index 0000000000000000000000000000000000000000..8bdd96405e7e5ee3dc1beb428139b0875bf9eba6 GIT binary patch literal 790 zcmWIYbaUflW?*nm@vO*AElFfyU|9;hPRRFWHsm?>yS1p) z>Y2#9R-e|!JZH6iHhH;a;@9onZ%doo@4d;DmmjL})bo=1S$!sl1CMjU_U_fc_WAnq ztc`2t#ZTkUW;~tED8JRP=J5n4T?ft^udJ>L1gd`0E84@`VR+SVa&}+hd%vZp)z2Ny zvO9f9Wj<^56~2(}tn!&Jn*85 zge_c8RrM~rlUQ(~Ir^RT-d!{ArDeXI;Of8|e=o5w$%Z?v%ua1tVuak*#eLn3i{Cdp zT@dlQd0c@vcZp%OwtIPzv!B?}pEB8}uB>~wC_yiF)kTf&V_$WC`o_(^ykNmqMXsAw z-9}epv!81H@b?LHGm1(RSt-(TPjwRqPqg8i^|C>i=Urc%8KY6ybfWTwh(ys}2AjD# zH_BP0dUrOjSS3Gs#|H7ZoRbgsPWeCk(Rtq!OS`VeYL|0Zk;Hu7EKT&s@M3!4uRGG(zx%n1tYl^Qa0l z2_x|&m?Yr5--`PKN~T&#F!HEM@JUF)3@9k<@@y3S5(E?$U=ZMk`S9F3=`hJ=|G7Y6 zK{G)+m@rHiBNs}56s6`Qf|L{&B^QeWX-3sEtS=9w-Pg%yRAW$sX=Y$Z&P~bD267cN tmH3&ZSy<&HIe2-vIN1e-L`20U#DrN`Wq|_Roa}r8@=R<}Dl&|U3;>ij2tNP- literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divmodsi4.c.239A327BFFA5B8B6.idx b/.cache/clangd/index/divmodsi4.c.239A327BFFA5B8B6.idx new file mode 100755 index 0000000000000000000000000000000000000000..822a31da391a753716aa64a9d336818c86ff75d4 GIT binary patch literal 790 zcmWIYbaUflW?*nm@vO*AElFfyU|9;hPRRFWHsm?>yS1p) z>Y2#9R-e|!JZH6iHhH;a;@9onZ%doo@4d;DmmjL})bo=1S$!sl1CMjU_U_fc_WAnq ztc`2t#ZTkUW;~tED8JRP=J5n4T?ft^udJ>L1gd`0E84@`VR+SVa&}+hd%vZp)z2Ny zvO9f9Wj<^56~2(}tn!&Jn*85 zge_c8RrM~rlUQ(~Ir^RT-d!{ArDeXI;Of8|e=o5w$%Z?v%ua1tVuak*#eLn3i{Cdp zT@dlQd0c@vcZp%OwtIPzv!B?}pEB8}uB>~wC_yiF)kTf&V_$WC`o_(^ykNmqMXsAw z-9}epv!81H@b?LHGm1(RSt-(TPjwRqPqg8i^|C>i=Uo@hjL|4;I#KyTM55>~gU#HW z8|5rgy*ry%tdgI+V}p2H&dCRRr~IG&=)CWVrCrx!wmg!aZ2#&ALvdwpk~}cPImMn@ zO?o1}m4`u@fk9PJTu=#20A(PcC^fB^0~jNVcWLj>`1xL$kw;aMPf`k|t)Q^Wvr+U* z5Kvf+_6i7!!Bhcx%7U6mJY7L!B%ZmTErKVcEo6w`2{Q@9 zox-Ck!X$#klVp;F^NLb)59;hPRRFWHsm?>yS1p) z>Y2#9R-e|!JZH6iHhH;a;@9onZ%doo@4d;DmmjL})bo=1S$!sl1CMjU_U_fc_WAnq ztc`2t#ZTkUW;~tED8JRP=J5n4T?ft^udJ>L1gd`0E84@`VR+SVa&}+hd%vZp)z2Ny zvO9f9Wj<^56~2(}tn!&Jn*85 zge_c8RrM~rlUQ(~Ir^RT-d!{ArDeXI;Of8|e=o5w$%Z?v%ua1tVuak*#eLn3i{Cdp zT@dlQd0c@vcZp%OwtIPzv!B?}pEB8}uB>~wC_yiF)kTf&V_$WC`o_(^ykNmqMXsAw z-9}epv!81H@b?LHGm1(RSt-(TPjwRqPqg8i^|C>i=Utzi5u;JqbfWTwh(ys}2AjD# zH_BP0dUrOjSS3Gs#|H7ZoRbgsPWeCk(Rtq!OS`VeYMB>l7u_w+&k$o$!7n#KnsM;gzaD!FchWcB!W1_MajkDK$=mN@#4dP!&iR3 zV^m{MgDYc5&P~bD267cNmH3&ZSy<&HIe2-vIN1e-L`20U#DrN`Wq|_Roa}r8@=R<} JDl&|U3;;O58211G literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divsc3.c.BE681C46D41E1304.idx b/.cache/clangd/index/divsc3.c.BE681C46D41E1304.idx new file mode 100755 index 0000000000000000000000000000000000000000..511f96e56c719a4168971bc1c8e35812c9c868b6 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$xxVF?P?1fZ?g0@8}UM|~Yx;r+9CCQepPw%ur+FKFA@Xz5-=8FIj@HC%S?;p#} z;_bOwuBw;U)#FCM>Q=yKZ45^oQm6$e0Xto%8X~Gh-bK!L0Wqf9X>!de?cKR`J>op9 z7xOGk@>#G)?LoDu_Sc0j_{2^hxOkvQTQZc6WlLJ46TnYUJjR4pfSpb_)Iqi7Fq^_T zQ`T!V zjto9X`Hwe$0Mh%){&RV4VgLXD0CHt!a{vGU0CHt)VE_OC0CRFPx# literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divsf3.c.C99FF64B7B096BFB.idx b/.cache/clangd/index/divsf3.c.C99FF64B7B096BFB.idx new file mode 100755 index 0000000000000000000000000000000000000000..350e51c9c819794e9fad2db13ccedde6be85e5d8 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAL0ssJboTZT4Y63A3 zhVw#WY87h>dr@o)LaS0Ny_A^D?oQ2NNwT7S`i_R8x1|tuve`M4IaycO`NtmTM@9F+hqpf)NiNT@RfpE$20V#>-J^35sj{ke5L;sdPa zvm$H`MX*QjK)0xO*M%;I%+3(GxTi#0vXqZiOU9rVz)w&*ri@O2n~XWAsN3o=oxnNM zE*P}c4x>k2-0{8Bo6+>HNaqekL^SXnJeDk_i(qCSQf3;4(2+!V}ZDm@$)(fFPv&y;WT1~jxLCL!D4P)60YPOf73 z!klCxYh*!@T0`u8CWpYV8;1R}LmJwrdNk1DOi+r@X|Uw`1Mq6HVbh6bIA*)}ogV~I zlf?%q|MBJz)lka^0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFl;f`uWGb zj$AaYX5NYIpHH5AeRSfwd*>c}(U|Msch%T|WzXF6x7(NRK7Mrl`?q&D{ry<{^Q~Y( zCF76isMD)&KG$FreGqk8$53*r=8q#avb~;>Rlaq`mk!D=>5r~C@cZZRt8o2JCi>f2%_HzD5frE2P9hPz)y^^I1oyXn9FGOJ5CQGF`?vy^C=m6||oft$Rp?F!&}{J_|Afbn)~0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$xxVF?P?1fZ?g0@8}UM|~Yx;r+9CCQepPw%ur+FKFA@Xz5-=8FIj@HC%S?;p#} z;_bOwuBw;U)#FCM>Q=yKZ45^oQm6$e0Xto%8X~Gh-bK!L0Wqf9X>!de?cKR`J>op9 z7xOGk@>#G)?LoDu_Sc0j_{2^hxOkvQTQZc6WlLJ46TnYUJjR4pfSpb_)Iqi7Fq^_T zQ`T!V zjto9X`Hwe$0Mo_G0dsk6VgLXD0CHt!a{vGU0CHt)VE_OC0CRFHq)$ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divtf3.c.B111A0CECA5D3035.idx b/.cache/clangd/index/divtf3.c.B111A0CECA5D3035.idx new file mode 100755 index 0000000000000000000000000000000000000000..c5b59da1aadf11fe58a868a94a7f19966c96837d GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAL0ssJboTZT4Y63A3 zhVw#WY87h>dr@o)LaS0Ny_A^D?oQ2NNwT7S`i_R8x1|tuve`M4IaycO`NtmTM@9F+hqpf)NiNT@RfpE$20V#>-J^35sj{ke5L;sdPa zvm$H`MX*QjK)0xO*M%;I%+3(GxTi#0vXqZiOU9rVz)w&*ri@O2n~XWAsN3o=oxnNM zE*P}c4x>k2-0{8Bo6+>HNaqekL^SXnJeDk_i(qCSQf3;4(2+!V}ZDm@$)(fFPv&y;WT1~jxLCL!D4P)60YPOf73 z!klCxYh*!@T0`u8CWpYV8;1R}LmJxWdNk1DOi+r@X|Uw`1Mq6HVbh6bIA*)}ogV~I zlf?%q|MBJz)*8zS0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFjDA4-ZY4gg^ zHM(zHH|lb%_1gHQD01?}xwGc0p6vSe(mGqC>Nc0+oS7$Qo|(?U!03ND^Xosu__O!s zt^T>FsxsDQ9g9vLYt6M|ANtxwvKYM%xLse_)}b}AeBxtYhn|&Xv+iu;w=UO;l`E8+ zwmDNw?WfL-#bpbmLUx~ak*-Nv&Ohf)@Dfu=uj88(*Iwj&psgX7?4*65&wbBTN7JW? zMs2}M)?CjxCCk=sv*YQ$$+I6m(euvck7T*>;jQd5jbob=(w-+LNwqx;t>&-)J68$U2VLxtUm?Me#86zB zntLDBb`^dwf%)p>3E-o$)CV(;!P?VZh+z(_i zrYf!=u7ZXJAkR5n#ZmT6Z|5ci#zdZzgp$26dP) z14D9dN{%*=tDvdG&n(TtDksUo%frRVE+`}-DlQ==%)%-Q6yWA$=M#`;Vv|ylVN_%Q E0AD-uQUCw| literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/divxc3.c.905FFC7F29340495.idx b/.cache/clangd/index/divxc3.c.905FFC7F29340495.idx new file mode 100755 index 0000000000000000000000000000000000000000..9a48c75a5e18649e1dc8b35bd57d5b1d51250d40 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZT4N&_(v zhVw$xxVF?P?1fZ?g0@8}UM|~Yx;r+9CCQepPw%ur+FKFA@Xz5-=8FIj@HC%S?;p#} z;_bOwuBw;U)#FCM>Q=yKZ45^oQm6$e0Xto%8X~Gh-bK!L0Wqf9X>!de?cKR`J>op9 z7xOGk@>#G)?LoDu_Sc0j_{2^hxOkvQTQZc6WlLJ46TnYUJjR4pfSpb_)Iqi7Fq^_T zQ`T!VL8#bM2iV54r@BGM% z9T|L(@*i*h0M_lx4Rd*IVgLXD0CHt!a{vGU0CHt)VE_OC0CRFin!vFvP literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/extendbfsf2.c.751092311FFC84C9.idx b/.cache/clangd/index/extendbfsf2.c.751092311FFC84C9.idx new file mode 100755 index 0000000000000000000000000000000000000000..bee12ec29fbca60e2bc6129029eb83534b93a2f5 GIT binary patch literal 472 zcmV;}0Vn=aNk&G{0RR9)WJ!2!WprT#0000J0001UbaH7|0RRAa0ssJboTZUpOT#b} z#q)*kV&|As=z~m!fo?-4K9)4OZR7H%B1cN^%m!0 zyIN*plFx!Nau2dYxxZfMgHM$7fff%s>RKC}j%BBnLdSrv(D4`(S_XDLqe%qWmE&R# z=So_y(3E=&4ykcV=Pqt;7k61&J7y73!MAsqs~9hWn4OP_Xb6^C?R8IP!03k{5tI%k zA7bD}*W8$c<;6X(wd0e?Wt==|gloxU#HC7E6j`)xAW3`jvpEG4Iu#=0owvw?=sU}| z!GB?jJZhtOM&VLI7+lg8fnY0w{d0oTFQQX*6PxKovNJ|@pqF5@8%Ci1cuUC>QZb`5 z*ssvUvql?y;QYV0{{T5f(JKIRd2M0<0001TWoB~#0001TWo%&p0001Ua$|D~00001 zBsG^gEzfY+mH+@_ZDedK0000WDIyO88w3R&83+vw3JC`h5)>5|7#0%*1sw1cN^%m!0 zvs`3hlFx!Nau2dYxxZfMgHM$7fff%s>YX+^9ji_&g^mGTq2n@A}Ady zKE%L{-f?3NmY4T@ryVbf%Q$(`2-lLyh)Y$nEVF3cK$7<4XLAZ9bSgx~J8zK((RY?_ zg8#x4dDKSnjKZaaFu0^G0>Rb<`{x9wUqq)=lbT5(*%>1{&`U7d4I@y0yrtv`shrXo z>{qDptkDJ^IREeMKRevfG;?`vVgLXD0CHt!a{vGU0CHt)VE_OC0CRF1cN^%m!0 zvs`3hlFx!Nau2dYxxZfMgHM$7fff%s>YX+^9ji_&g^mGTq2n@A}Ady zKE%L{-f?3NmY4T@ryVbf%Q$(`2-lLyh)Y$nEVF3cK$7<4XLAZ9bSgx~J8zK((RY?_ zg8#x4dDKSnjKZaaFu0^G0>Rb<`{x9wUqq+6CN`5ovNJ|@pqF5@8%Ci1cuUC>QaPnF z*soCGS)&a;aQ@%he*ivz(LDfjd2M0<0001TWoB~#0001TWo%&p0001Ua$|D~00001 zBqTfYAB)BWvj6~NZDedK0000WDIyO88w3R&83+vw3JC`h5)>5|7#0%*1sw literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/extendhftf2.c.60BD20BBE0925EBD.idx b/.cache/clangd/index/extendhftf2.c.60BD20BBE0925EBD.idx new file mode 100755 index 0000000000000000000000000000000000000000..fecae841574486311cacbe52db906484169d3d86 GIT binary patch literal 472 zcmV;}0Vn=aNk&G{0RR9)WJ!2!WprT#0000J0001UbaH7|0RRAa0ssJboTZUpOT#b} z#q))3W9OJt=z~m!fo?-4K9(%GZR7H%B1cN^%m!0 zvs`3hlFx!Nau2dYxxZfMgHM$7fff%s>YX+^9ji_&g^mGTq2n@A}Ady zKE%L{-f?3NmY4T@ryVbf%Q$(`2-lLyh)Y$nEVF3cK$7<4XLAZ9bSgx~J8zK((RY?_ zg8#x4dDKSnjKZaaFu0^G0>Rb<`{x9wUqq+6CN+~nvNJ|@pqF5@8%Ci1cuUC>QaPnF z*soCGS)&a;aQ@%he*iyN(Lexmd2M0<0001TWoB~#0001TWo%&p0001Ua$|D~00001 zB=CL?PhESfHUI!)ZDedK0000WDIyO88w3R&83+vw3JC`h5)>5|7#0%*1sw1cN^%m!0 zvs`3hlFx!Nau2dYxxZfMgHM$7fff%s>YX+^9ji_&g^mGTq2n@A}Ady zKE%L{-f?3NmY4T@ryVbf%Q$(`2-lLyh)Y$nEVF3cK$7<4XLAZ9bSgx~J8zK((RY?_ zg8#x4dDKSnjKZaaFu0^G0>Rb<`{x9wUqq*3qnb$}*%>1{&`U7d4I@y0yrtv`shrXo z>{qDptkDJ^IREeMKRaE~F>`rsVgLXD0CHt!a{vGU0CHt)VE_OC0CRFn+a literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/extendsftf2.c.FBF219AE01DC013A.idx b/.cache/clangd/index/extendsftf2.c.FBF219AE01DC013A.idx new file mode 100755 index 0000000000000000000000000000000000000000..374c4f375af37121060f990e55a376e4f26c5251 GIT binary patch literal 470 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 E03%#Gp#T5? literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/fixdfdi.c.BAC876D4848A9BE1.idx b/.cache/clangd/index/fixdfdi.c.BAC876D4848A9BE1.idx new file mode 100755 index 0000000000000000000000000000000000000000..6d2f43b3c95a2b526cebe22c2939824a4dd99692 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&O9L?s z#`}eG^>oZB+zXis1Koy9d^v7y?k=u>j$etNSNoNq-a;Yre`$*%%Hz~g+reS2SS z7Ozj+V+yqZC7{uDsv)9EEO<--&dT6 z^q9KF# zQvPSsk1D+Q2639qv~ziFVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&O9L?s z#`}eG^>oZB+zXis1Koy9d^v7y?k=u>j$etNSNoNq-a;Yre`$*%%Hz~g+reS2SS z7Ozj+V+yqZC7{uDsv)9EEO<--&dT6 z^q9KF# zQvPSsk1D+Q26{Kl;d6OyVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&O9L?s z#`}eG^>oZB+zXis1Koy9d^v7y?k=u>j$etNSNoNq-a;Yre`$*%%Hz~g+reS2SS z7Ozj+V+yqZC7{uDsv)9EEO<--&dT6 z^q9KF# zQvPSsk1D+Q271cO0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&O9L?s z#`}eG^>oZB+zXis1Koy9d^v7y?k=u>j$etNSNoNq-a;Yre`$*%%Hz~g+reS2SS z7Ozj+V+yqZC7{uDsv)9EEO<--&dT6 z^q9KF# zQvPSsk1D+Q26~aq;d6OyVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&O9L?s z#`}eG^>oZB+zXis1Koy9d^v7y?k=u>j$etNSNoNq-a;Yre`$*%%Hz~g+reS2SS z7Ozj+V+yqZC7{uDsv)9EEO<--&dT6 z^q9KF# zQvPSsk1D+Q27@lm4s&^JVgLXD0CHt!a{vGU0CHt)VE_OC0CRFV!Z literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/fixsfti.c.B78B16B87EA4D0FB.idx b/.cache/clangd/index/fixsfti.c.B78B16B87EA4D0FB.idx new file mode 100755 index 0000000000000000000000000000000000000000..f363524fd398e76a86917ec13b4b86577a0bd5d6 GIT binary patch literal 466 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/float.h.625403E5DB9249DE.idx b/.cache/clangd/index/float.h.625403E5DB9249DE.idx new file mode 100755 index 0000000000000000000000000000000000000000..959aa10869efd73498bde6c51cd64065bae1b612 GIT binary patch literal 1090 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floatsidf.c.B60844C3948DAD9D.idx b/.cache/clangd/index/floatsidf.c.B60844C3948DAD9D.idx new file mode 100755 index 0000000000000000000000000000000000000000..19f3849541c04e56529ca4d96f6db7f09ff61e2b GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAU0ssJboTZT4P69Cy zhWkQ8T_uPndtp!$5(Q!~UXs$zvLiig+AdjqdIx#|x5lKI{BxeK0zkm?Y_|FMT&(Bs zFPp`3^ZK@YS_@d-3iwjivc(}sB|r;kjLHfU>P*2W_M3>9vhs%f?&S9VoVqUY0ao)_ z5jKY+xJU0nx2X5mfi8y3ogs4YK#8_wDIe>Wj6pAeS5P{pj81@?jM=ED+j^Kz;OuD^ z4BC2+(IX%3c<%J(ZhBv&b3+jk4g3U;#Y^cTnAwMvnTBEc)Q&n%MogiP8o^MkWuKz7 zw3XH#oU9(?mb@H|F7K4nR{0$#1#_8NS5*-^-?QYJ@@?LLhStO+WE&jHsJhn4RSe&l zlT2idEGSZIh`rC`5EypDuz&85jSVU%GR;VfGen6)r@@l%2jJ`Ej{8nP)tD!UhAcix z`M+IPdKAPjWbn^U0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFV!Z literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floatsisf.c.C8A64A1A3FD185DE.idx b/.cache/clangd/index/floatsisf.c.C8A64A1A3FD185DE.idx new file mode 100755 index 0000000000000000000000000000000000000000..9f2e899eea47ffa3b08461ec8d8cf043ea197a7e GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAU0ssJboTZT4P69Cy zhWkQ8T_uPndtp!$5(Q!~UXs$zvLiig+AdjqdIx#|x5lKI{BxeK0zkm?Y_|FMT&(Bs zFPp`3^ZK@YS_@d-3iwjivc(}sB|r;kjLHfU>P*2W_M3>9vhs%f?&S9VoVqUY0ao)_ z5jKY+xJU0nx2X5mfi8y3ogs4YK#8_wDIe>Wj6pAeS5P{pj81@?jM=ED+j^Kz;OuD^ z4BC2+(IX%3c<%J(ZhBv&b3+jk4g3U;#Y^cTnAwMvnTBEc)Q&n%MogiP8o^MkWuKz7 zw3XH#oU9(?mb@H|F7K4nR{0$#1#_8NS5*-^-?QYJ@@?LLhStO+WE&jHsJhn4RSe&l zlT2idEGSZIh`rC`5EypDuz&85jSVU%O3g@%Gen6)r@@l%2jJ`Ej{8nP)tD!UhAcix z`M+IPdKAPjZRgK>0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRF literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floatsitf.c.202E46AB119C0745.idx b/.cache/clangd/index/floatsitf.c.202E46AB119C0745.idx new file mode 100755 index 0000000000000000000000000000000000000000..6a5c4f816f56945fb44b92717a239dbfb778a80c GIT binary patch literal 466 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floattixf.c.FD40D4766D0CDD61.idx b/.cache/clangd/index/floattixf.c.FD40D4766D0CDD61.idx new file mode 100755 index 0000000000000000000000000000000000000000..3a3ca177e93fb01367bc2294f015794c0c21e6f6 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7?0RRAU0ssJboTZT4P69Cy zhWkQ8MG2zGUKrGbM1dHLmz&bgvLiig+AdjqdIx#|x5lKI{BxeK0zkm?d|rQiE;oz! zmwLIXU*A?w8v(0Z0bj~mwm9Ud1ZV+`QCUGkohkUleiIQ>R^E``o!s7^Q`aRvz9cqv^3Gy9M-(=aTb+EK^Jh$-|@BN&R6>{FDM zw$j>zlj8@uB`-&#%RA+?Rer}w!Ca=&<8cu?-?QYJ@@?LLhStO+WE&jHsJhn4bqwE_ zlT2idEGSZIh`rC`5E!;**gtp3#s-x$4b4c4Gen6)r@@l%2jJ`Ej{8nP;|Wg?4Ox7Y z@_)Oo^eBj5af8o|0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFs_Cl&cLE9n~FH4%t?#AY4NwQ_@(>rZ0s+S^!a86DpnJ*Cl0v_k{?c4iu zvv_^lE?3*{xEFqD~Ciuj@jzlR-uZ?d`w)f}g=N2De zy_gqab0~sq)E-nzYX5Vgiy?Dmh`e|($?S|Z`B=3^Yw`m43X_g0lM~>k6P{#LZ8glM zaCXWCO}5%o^u&!jK6iF?GrKL)xuJ+i8oq+3;!?T@X7(XvreRoawKE-uky7ZRBG4vQ z*r$lr?9keS!|@&NjK|UFGESMY(l;Cm=F*iKkBex0&yx3)XY(2qv^pk%ZE%E9cCEv8 z44;$}CSx@g6jTag@3V0P47+96KUZLFgUmhul&(igoH0rQodRooKLGcK4OgC!#uGk6 z)W*_1;(u@Zs_Cl&cLE9n~FH4%t?#AY4NwQ_@(>rZ0s+S^!a86DpnJ*Cl0v_k{?c4iu zvv_^lE?3*{xEFqD~Ciuj@jzlR-uZ?d`w)f}g=N2De zy_gqab0~sq)E-nzYX5Vgiy?Dmh`e|($?S|Z`B=3^Yw`m43X_g0lM~>k6P{#LZ8glM zaCXWCO}5%o^u&!jK6iF?GrKL)xuJ+i8oq+3;!?T@X7(XvreRoawKE-uky7ZRBG4vQ z*r$lr?9keS!|@&NjK|UFGESMY(l;Cm=F*iKkBex0&yx3)XY(2qv^pk%ZE%E9cCEv8 z44;$}CSx@g6jTag@3V0P47+96KUZLFgUmhuRH{cxoH0rQodRooKLGcK4OgC!#uGk6 z)W*_1;(u@ZtpET3 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floatunditf.c.BB11B91A5C07D1D0.idx b/.cache/clangd/index/floatunditf.c.BB11B91A5C07D1D0.idx new file mode 100755 index 0000000000000000000000000000000000000000..dffc9395448dca5bad4eea1f73ade3dc5aa27562 GIT binary patch literal 470 zcmV;{0V)1cNk&G_0RR9)WJ!2!WprT#0000J0001UbaH7{0RRAa0ssJboTZW7N&_(v zh4Vtwv07>s_Cl&cLE9n~FH4%t?#AY4NwQ_@(>rZ0s+S^!a86DpnJ*Cl0v_k{?c4iu zvv_^lE?3*{xEFqD~Ciuj@jzlR-uZ?d`w)f}g=N2De zy_gqab0~sq)E-nzYX5Vgiy?Dmh`e|($?S|Z`B=3^Yw`m43X_g0lM~>k6P{#LZ8glM zaCXWCO}5%o^u&!jK6iF?GrKL)xuJ+i8oq+3;!?T@X7(XvreRoawKE-uky7ZRBG4vQ z*r$lr?9keS!|@&NjK|UFGESMY(l;Cm=F*iKkBex0&yx3)XY(2qv^pk%ZE%E9cCEv8 z44;$}CSx@g6jTag@3V0P47+96KUZLFgUmhuRIW!#oH0rQodRooKLGcK4OgC!#uGk6 z)W*_1;(u@Zs_Cl&cLE9n~FH4%t?#AY4NwQ_@(>rZ0s+S^!a86DpnJ*Cl0v_k{?c4iu zvv_^lE?3*{xEFqD~Ciuj@jzlR-uZ?d`w)f}g=N2De zy_gqab0~sq)E-nzYX5Vgiy?Dmh`e|($?S|Z`B=3^Yw`m43X_g0lM~>k6P{#LZ8glM zaCXWCO}5%o^u&!jK6iF?GrKL)xuJ+i8oq+3;!?T@X7(XvreRoawKE-uky7ZRBG4vQ z*r$lr?9keS!|@&NjK|UFGESMY(l;Cm=F*iKkBex0&yx3)XY(2qv^pk%ZE%E9cCEv8 z44;$}CSx@g6jTag@3V0P47+96KUZLFgUmhu)KHIrZ0s+S^!a86EUGG7FMfXDfK`}V%v zEMA|s%hmSzW%aNTu(}rTp{(T{ha8mvEuc0kD@dp_1)td05iw=u4f*C|dw-68Uhx6e zi+K??ha$K}??Jby_dgH17&2Fe$cG0?v?ELTShZvfdI9_drDMwI1i0yhHx+eT4YMhn zop!;Xt@ao_^5Bm9&aQ4|w?#TP6cN$DSMXR|N*BS*KBUYv49lZ-)NvRwg+6KoL$Q*5 ziqg_fT6=JEd?$D0@|+6O)i_a44hdS|`^r zd}2;Aku|cQNUb6EK9fUW*e%2UxkA=9sNDNRrXFc=#wZDN8Z7yK0G>}aTzNtoPq>Gu z$>P0~|9$P38wK$VYeLcY0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRFrZ0s+S^!a86EUGG7FMfXDfK`}V%v zEMA|s%hmSzW%aNTu(}rTp{(T{ha8mvEuc0kD@dp_1)td05iw=u4f*C|dw-68Uhx6e zi+K??ha$K}??Jby_dgH17&2Fe$cG0?v?ELTShZvfdI9_drDMwI1i0yhHx+eT4YMhn zop!;Xt@ao_^5Bm9&aQ4|w?#TP6cN$DSMXR|N*BS*KBUYv49lZ-)NvRwg+6KoL$Q*5 ziqg_fT6=JEd?$D0@|+6O)i_a44hdS|`^r zd}2;Aku|cQNUb6EK9fUW*e%2UxkA=9sNDNRsUB%@#wZDN8Z7yK0G>}aTzNtoPq>Gu z$>P0~|9$P38wK$Vbd%B~0CRb5VgLXD0CHt!a{vGU0CHt)VE_OC0CRF@~ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/floatunsitf.c.3F63253F59A658AC.idx b/.cache/clangd/index/floatunsitf.c.3F63253F59A658AC.idx new file mode 100755 index 0000000000000000000000000000000000000000..05fedd0d92818689bc509c25acfeb0a30e863308 GIT binary patch literal 470 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/fp_mode.c.F75D5BE2C68790A2.idx b/.cache/clangd/index/fp_mode.c.F75D5BE2C68790A2.idx new file mode 100755 index 0000000000000000000000000000000000000000..e74f1c3cfbfc42c3e0c9a9d10e758e66d09b50e1 GIT binary patch literal 466 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/int_div_impl.inc.BD3EFF8675E59301.idx b/.cache/clangd/index/int_div_impl.inc.BD3EFF8675E59301.idx new file mode 100755 index 0000000000000000000000000000000000000000..7726ad7240f5c361b1cb755887ec1e1df4c7c02a GIT binary patch literal 1024 zcmWIYbaVT`%)sEB;#rZKT9U}Zz`!63#Kk2=nZJN^DkB3!#T?rJZ|}nn0{7+{wKs{) zT6ZhRD=#R(hQpGhDtg<^PRYCOGv0(P{jz_zVdwUrai4{*cYn^6^qkngKwmpz&ik~A zJvv7|9t$eE!|R&tSGy!Cx`T0wSDRn{md4~RfnxDvGj1IAyxn5^ z!sc+mWrgP#qBNd1oy_|eK2MpB!8|WfL!->g#o-n;v~=+&JAfQrUi@ZB*oS z*5!Lz4?n8jAG~|*8S_0S%f%q>^{;24@{6rJ4D3MZ5XlflFu}md%*epQ#ZdIAEZ4vP z#StC`PN1}ol#Vi(0O@7}>SicPO)HLJVqlo+Qg^B=jFFL(grYQY6+&Yh}Sh=`)IC!{$p#lax+(M#45=cA^A#DUtUsNASPG3VGE(h}u zBNrqnp?X$sN{V6H$~|3>g_~c1UlOJY$W!6hMdBIqTOoJ?G6Jdyo)nW5H-aa_B!k4$ z5zvuDgqDtqjxG|xo}qe|g)+zyJUmV^aeF literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/int_endianness.h.5C1E934C459A2C11.idx b/.cache/clangd/index/int_endianness.h.5C1E934C459A2C11.idx new file mode 100755 index 0000000000000000000000000000000000000000..27945a8d412e373862596880988ab6468ffc28b3 GIT binary patch literal 228 zcmWIYbaT7Iz`)>~;#rZKT9U{DWD5gvaY<2TAdvP3;)*$}2NSs(6nNMI^i%H7pYTHD zu7ivCx{_mQ7d}>>pL-{RJ-}T(qblq8!pDm;4f0scR|Ytri;JIm=VX0!M&B^@3LgvVpFi3=M*lq0f&ntILoA>$N_kQ=@ z@B3a07>fFt2f)T1OjSuyg*6xeuo`~LE6R#r;Q(NSLRH(@=Hc90ov_}W5aVj!`9*2v zmC1SD)0!Y|Z|#JL-le-NoqA&I$e%Vmb1kR+JCwR{^2wjBk1)EUE5Y5rt7B@@z$0r< z-@Z!gfb`Me`drsAy*|YD?VaO|N!j%^_|o4&Q!Rh!^Y2JD@y^@lUk zHf&9)_~f>s(p9^+)_#AFt$3t0_I1_WvDv!5rEUBib=&jqiRRXem(t%)8F#9F#d78| zi+5kB+H$MQ$?rY(s&;0fW;&xyGeS5^u>Px2*Nj=*#cHbf4B2hkeyc?{V*YW*!tz(# zRSO?RJ~*Ii${eqsy9Ne=Tj!R~RbLq!H2fATaq~F$%HA$NP*Ru(duTf!qCW(lVK|6} zo%LJ5n11KxnSw0g4KnwZa=#e)#91c#H zWo9LsJZdC|?`xpHiX-^5Z*q7NK`>4*LPiwmCc&r}4U4o)I*as7HlorQ>-8;75(z9| zlpEE7g%G5W6rq>m1Su!gEYgrVM5qv)m^V28#87Nd_QvIxQCLv+hUAw+W54cn6pU** z0wM`Z3iqo3EgrhPiTQPu7nHp@`Q^T+zduN}3DRK^IVSgm-#NqaHRiCo~5I z2yCTCm_ut83IqZ|hRIMW04EH<5P_bBO#wz0k$_~837A+!0g6R5pjpHKhDByzW|0M0 z0)#diT$y)+`R6e$E8Z`xvsb~Dg=687Xm+_7(y_#cH*2Asilw665AvPQD^53TJql$V zrVI2T&fbxw|IX0}%dnGhuUUi^5sDF#%A#SB){@R5y(JqF+MTdH-s9z813Fw# z_8uy~eDh(?<1~H4C|qy?mJkTORGK@}6gBY!oP|MdP@{)&!Xz|_PymqRCN+yRCLJQj z=qV{bx_=SY)neK()JQIKxW6vG{x2veVu?Z|zgfPv{UFx;0?Hap6OiF~-(&T7%Hf~o rYo3AJ^W(b|XaIm}WvE;k68o>aI7JbCXL;+CsyMj<#I4+0w=(=6q>9rs literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/int_mulo_impl.inc.30AD609D66153543.idx b/.cache/clangd/index/int_mulo_impl.inc.30AD609D66153543.idx new file mode 100755 index 0000000000000000000000000000000000000000..c82e429aeba9522123fe20fe35d0e0d8c5096d19 GIT binary patch literal 564 zcmWIYbaT^TVqkDi@vO*AElFfyU|4nWvhbmKz4rqT ztK2v6bt`m{*%KvBS&^q+@UTPL28>({bK4LB8PvD+o=Y~JdyExh~EIGk&3|AZUn z38wfjQ&YeB-1{5L)$FulhT_WHBzd6wHMjo!9O3YE77qi^XY4|fLP}tQfs=`mnS+&q zp(r)2m<8y^sV;S=y22P4d05zm1cW4D+JHP|A#Eg{zK}VBCoC(hir|TGhzKC@Bt#St zJW&o&Bsp;=aV~_M5|a`VPnk&>iKoJ(g2Yp0QibzYZc2(_+R8nhiG^K6Swsh6oVcjC z9E=B}8Mz?71_lTSoO>r7CfV#imyw5ESX0;#A_xkLoJ0`2xG1?;9K>K>BKl^P_CXgG MMm7dEkN^Y#00UUa;{X5v literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/int_mulv_impl.inc.3446C6A8D30A8A95.idx b/.cache/clangd/index/int_mulv_impl.inc.3446C6A8D30A8A95.idx new file mode 100755 index 0000000000000000000000000000000000000000..d913652579f1baaee24c0f787bfd2ee7b4fa5ea3 GIT binary patch literal 650 zcmWIYbaQKBVqkDi@vO*AElFfyU|wV!EiPjBvdI+5io=dGnJIrr8E>9L-^ zzM|!-?v0ZYYlEI#@RAQ=F}iSwP34Ctd-7jnBgH!z%eCLme3YJcBCD@sZn>1RbqSyT z!TY6M5-0C{Sm?Z7S1Yu2qyLkVuU2M@EFUZnh?rFRUH;K-*9p=&zI&7QE5G3t*9?7B zT$!6B4|MCHjlauW7*4zLFaUkRE+i?W1SS|bnHZTlSQ!|KQqzjF7#SGOe$fk%71L2< zVPThKkraVxV_}zLkwfBXuxW@P`n-4`eQk$NVTO`)u{Wenu8{5oHk_m^J6#Nry=``_EK;#zVYdy?YUF|skRfdn7`02xfpNB{r; literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/int_types.h.C0E7CFD2C94C57DA.idx b/.cache/clangd/index/int_types.h.C0E7CFD2C94C57DA.idx new file mode 100755 index 0000000000000000000000000000000000000000..209530ce85066af4cd7cb95975e24d9808f11384 GIT binary patch literal 2610 zcmYjS4Nz276u!IMUEjWU@9v_oETE9n;vgUfhJYw07^6;zf>0`kuz=vQsBd@4M$~A^ z1T7Zq6Svdv$N#zgoyEDYd_qsj`DmqcVxBBI+j>^8(lLtHh*}Z*Ajw5u6&w%W8!Y_@zhQ2n?@tg>+Z7pAcVF~UvsXh zNT-ufC_;2LnLV5XGO@Z5(ow@F_{)>CjCN5%tV1*=I3|okz+wN-_80dTIz!E9SP-JI zrdYxO3H$}L;%@1Yxy^RFq%f$%>acML@E2e1Ui9YbgA>fij1hH8P74R%-_F{Z;rr1y z&5SI}TqqTqIe_`h;N=COH&0Jj&GAyanJNHgsbZXMPU*mWGaAm4%fy)m4q!f&G;r$J z!B(f5d%h{3PzAvJ&50)iz75o?vKQio2C4v<+jl%}d|WZVPBkatBm-3d%zZWOgY{7p zH>i)Nm{JH;0L($Rmb!XY9p5CO5Z0LR;P5aGfyNwtrZ}N_Z`@|Jv@)s8OcenBX9voP z^@pTw60$LVUT|I*hXDVjx})t0-#*!#x2xG#;VJ`F0L&K; z#YXHanB1mDPm|KjQ~@v_sqD|&I(Yw_gzPN(RQ*&Fhd}g@vo!_I&z)D)=m}DSg(?92 z6_K;=HV?maMN&46+O2jQhXDVz=SH=jZJcyfLgCDzT3>DA5OA1bk^ibrT-ryFl{vV= zTu~g5$)H1_0-M~e;RCiBZ9K>c(pD)0O66&(LY)~|8rAbt`QKO{jQv?`1LJM)B2n$4L z87>oHs0ejprwF@8sN3ugfyW80rL`jhCplV<(Tbt+Sb030CP`C9HoSj}=tMeF7)kwE zAdm!ht>^(l2>J4=65G_nY7FdkwDJaoN*b`oZQ%L04J6luGLN;aV!fiZGH+& z7`x_@=D*GgznHyv$=P?=wNG+7fcmDi<6&)kQSYh~KmRZqU7`1nOMxP13AIKytTG2?q4_mGheTe`PL8xq%Z9svr ztPC!gehvsGdx;CB7S4;k2H+Cv!#?c<<*=8yc={>z1^r{>ao-DS>08Sv%EICD?!3pBCYekpg8p#zk crOLr0J3V|<=-f9#E_VE$TBjpO`%Vb`4-4& z1sNo71uZ96)YkEtoDu-Lo-Zz^d{F~8utbOb7bQ#aRAc0w!MF-tk?4}9{0`KbSD;mn zKnd3t!KKKPr_+(D=stxiR7idbXm`A&kFHigm7b}j?k*067WLx6Jx=z zmLmc;Xt?ufKb>}heyUoJc_eK*+pl@Vl+^&&;Hpj>oZ-18SRluaOl~de4nC&f-RcEV zzwAJHR0I}xP33Jd8r>2t<=!RUaqM-7-sY}>FMZ&H`hD^6u0~z+M(z4NV{Tg?QorHR zm{&QCbPj<8A{}7clI;mk(S;fumC>fxi1au18|@`h-Os@>jvi$+gJg3Y%S9rGZXxJaai`Ncw zd2M1L0002Z^e#{x7AzqQ044wcDHR1394ZzL79{`)0s$o~Cjlx20CHt!a~A*r0L}C+ zP#qR5Apr_06$KR>00000000000CHt)VE_OC0CRFzr2y(uO$IWwbLF71vM6z`hN&cE-yZJ^j^Kgnf^-j8>wn1_EUTbXM3UNmT$ z+{;-0`&T^FlrIN$e!9Nysr#Cz_REE$r1=V6gHP?+{b82GB5^n0M_U^Oo{Vb=?$ zIl}jIBYdx|o0v8r>Z zi$N443}EDhXoQMCW?I?AfAX?AP_-n7q%=&m)grqYcDqb`fx;pjA`&p+Jdc$p3@$(M z2MQ~2D8S7=w4(8!RNT8bps)&u3S4;e!!m|z^@8z0VMPu_xbTg&uRqxsRwo06wK=rK zVP@C#T*_OyuYM6wSdc?d2qru`iGA5rrQUTwVI2+~xFLUCh2(?Rz1{&7mg10-fvH}5 zH@~#AOyLMnSe`>3t~$0@YC#pps$YyetYQpe95B^~4RhlUHNO4}R4vUR4L77HH760I Xq_`-#m>a}k%|4$cGr_9Blz{;Na*Ldd literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/io.h.2E7FA466828E882D.idx b/.cache/clangd/index/io.h.2E7FA466828E882D.idx new file mode 100755 index 0000000000000000000000000000000000000000..1838e424a24594c6c6c859c9a37d3dfa6f0327f1 GIT binary patch literal 504 zcmWIYbaVT_$iU#7;#rZKT9U}Zz`!63#Kk2=nQK67pj^eA-oAr;O$Iz|zcplRJebTR zoH_CzoHbWSmX0hnxWs!!;QrlAn-w1uF3J7+`hV7;s;welU7R&esi`b}T;TnX{mi7R zn`$>{EsDJ1u5-=(RrR?^=8CM5?~~78n0VDxN$Prbis39d{x^MA6<<mO~_)O`VxT%Lv@G$T| zW-&cnbBQ^3c{$HTzM%nVV$P?VZh+z*t4*~Q2S zu>-2y>6cl}lgYOonRqyPcz8r$s(3hgxp;+O*0=vS@-igwdkaVr0}nfrB1v8am?9Vr wv;gczs0A<=0)@dYg9-!Pm6Hf!7Z)WLi-Q=PnQlL~aYp@G!N|eD0TO@!0Lk{9od5s; literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/limine.h.425D8D97D5109245.idx b/.cache/clangd/index/limine.h.425D8D97D5109245.idx new file mode 100755 index 0000000000000000000000000000000000000000..1ca0194d68a6e325f351e4f1ea635bc44fe1b8b5 GIT binary patch literal 21970 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/log.h.E0E90EDA1BF56D22.idx b/.cache/clangd/index/log.h.E0E90EDA1BF56D22.idx new file mode 100755 index 0000000000000000000000000000000000000000..e5c3e60ade8e559bbf024e3603368bf7d9dd9a8a GIT binary patch literal 248 zcmWIYbaVT_z`)>~;#rZKT9U{DWD5gvaY<2TA&{;F;)*$`CmgvB83?#NwDc0!i<yA)O`IK!NE(P9-n)iZzOP*RSLvdwpk|NO7 z&g&*_&zj_#c^KG$JP=@IVrAlB;ACQCU}s@uW@RW!O)C}$io;Ygaza#q6$6Q))SN^R XySOO1m>a}k{abT>kM!T@{|pQOYi3f* literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/lshrdi3.c.F40A6E4F6735AE96.idx b/.cache/clangd/index/lshrdi3.c.F40A6E4F6735AE96.idx new file mode 100755 index 0000000000000000000000000000000000000000..317991026e4e7944fe83fba1f88c773031bb0d3c GIT binary patch literal 978 zcmWIYbaOk!%)sEB;#rZKT9U}Zz`!63#Kk2=nF)*x3_F<^7%Jw>osjR(WXN;udux@j zVu#xILkrYYxQ-;$R9bE;3cor3^fu)O%eNaS?>U;1Id5C_wtrd-EH=K&ul_z>V_IFk z?pgP%r==fv2yNIQ`XN&Ku;6#iD@;=wde;T>3Wh4ZS9(6XK_d9A$gI<}#!kETZZpS9=$q5LEOFrxPQ~zr!3ih6RzJ9z za(JEcxr8HifuZ}wHYzsr2gUtY-x>1JuIt->|2fD11-FXZEBil>DXz>-k_U!&_OYy% z+@<_8c^H%#7*vJCg%rR9PzC~uQqzi$0pp|adE%bHi4qb_JgPzhLSk@jszQoF>M&kG zVV7s4=$9Zypdtn#ewZ2Dsk&kTiLW9#cvL00C3s+}c~m92C6RfOl2QmcS#DV*Iaw)L zX@r~{w;Yn3oRl20oTHo*Oy!-N?Qd)3%({V&7UK}(h6(eiDhMbD!+1Vrd$;Rs`!k&t z=sI2rL6|Vmb<&dZ2%apjERvk8jI07ePEJM+&Vz|Ea-js|xp&fGlFj~efk7i|By0r> zn)6#Vq*esmtYHRP$15oS)6AnP$18`-bCz?1$?ZwI>p%7F$5TL0i7<(9!i0HLMVUn5 zyh3Te=M#l4UIAIBA*=^eRFs;N2(r4kD7jc1NHeOk{>W2hdBLp7sKTHEa})zZa&AhF yHjt~Jsl?AL&B7`t$-&FR#mO!xBqAyr)pjui0 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/lshrti3.c.69AEAB488A42C507.idx b/.cache/clangd/index/lshrti3.c.69AEAB488A42C507.idx new file mode 100755 index 0000000000000000000000000000000000000000..5dc927394c0b0c87d28fe02b68f121d68ccaee29 GIT binary patch literal 1002 zcmWIYbaQ*e%)sEB;#rZKT9U}Zz`!63#Kk2=nF)*x3_F<^7%Jw>osjR(WXN;udux@j zVu#xILkrYYxQ-;$R9bE;3cor3^fu)O%eNaS?>U;1Id5C_wtrd-EH=K&ul_z>V_IFk z?pgP%r==fv2yNIQ`XN&Ku;6#iD@;=wde;T>3Wh4ZS9(6XK_d9A$gI<}#!kETZZpS9=$qrbC~@HtPQ~zr!3ih6RzJ9z za(JEcxr8HifuZ}wHYzsr2gUtY-x>1JuIt->|2fD11-FXZTit&?r?@gVNgf#90XJV< z^7-;wf`>twfk9P7Ttop(0A(PcC^fD4E-*f(y40QO3S(qs;!zb55D|lGQx#DZQHSvg zpC|4KoG2l|$fGK%DXI?>hS7{%C}t;IJ{{XsyTzE5M^%bfN)V=sM^#!{S{}iZ=aom2 zlb4ZKK*%Y`D8PAqZ&$l0GdfuSE$3tB6NP!8ps>rcQS?g?P*{XPgdZlnS0P4c;xett z%s}gSr3H|Tps^~P2tj40&FfWuF$gV!oX>|=4C1OlsoG{fq zs^U!IaNhC9u@yQCiyr_LNpMJTBNQnKC<()O3`MCqi6CQ(i;|1QK@1fT0S1h!LVh1N z)meAFWmI8E&P~bD1_~=^D)BQ*v#`oZa`5tSak2{viHM3zhzYZ>$^r$rIobIHS9%b=NzL6PJ!YnZUxCRs_FinOJ5(soKI zj~3gDQ;D2a(o42lYCBOUNz2jJdhMM#=l&=EbN=`I?&tTrzyI&|z4!hjLxO_ZsQ?6Q z4#~?%&Pl`o06OrM6kyGM`*}U`d(auu~ywUXH-Nf|V(EL>6@WSPp=!FYrAI@*P z!T$I+@nzO{N1&JflR|QH+tt*&o6ExZVMET}@VrE#yG6?VRw4CCp7TcbfmDUV`%#>xFvv_C4Em|cegH)@uT4@`fOhX#0t(<-}H z+B_7D%sL*rnAE!(yR(8OmF{*umd$>uDe9?WyVy;zliSN{L_4tuThH^#$K1~Pk|Hnc z@jYu&7i=p`e$#MuO+j6gvyoowK0D%@?QB*R|GxWuuZR^4zFWGk_9X~u< zFY!w_CobN8adzc=D`BE&pR0!K=`-WN^#N2D3GH1zuVhR3iEe_t%w?COux7TlOJk;Q zzw@oP`jI*E#?KyDCf{FFV)oZ6LflB<3ml+PN+hS2Ajo)rVQLAM*jO+z^#_YPXoNy0#$l{#>NZgXez)ye_6jon6$d-2#j z25^UNf6Sk%9FY4-19F4x?=wmLu)^6@b9tN_C~n zP{~5F7wa3iP@OVC;dH<}ua&yYkIeUUT_ZWJ}jNVP;j6?`=l zItcxc4~Ym1S15=|`RzsD%Cbq82dpsMHrx^6E1WeAL)rt&An>gdw*EV26rEbB~%F;VeccoJnP2Sz7WTo$8!}!8Ue*5W8wxRp#GxR0B8nYbe)yEJ4&nqX z0awo=#G`tm?ng1ix$Im^^htDbNc2S~hQSqKA~Fhst?G*nRI_;FcvIC(Vj?j^v&-d0 zF&(^$OvP8QTrGt2rL=&Naepbq5{|?QVNrier;mDt0-LkU`KSY@9a}CjL@RbeY@lhd z49T!}&^2hZ$aFWvc~~9=C25|zORW62PJz>~G+Z5ne*)_QnQMy)YKsmpuiK7&X7ob^ z2~*}yNZU#|5Lk5$n$^h>QCdKo@tud419q>+T^hFzaR;w|% z!IWS_q$WHBON1t)IwaabIFzmaB8XN80)WrJ6Llcnv% z0F3?`mv&E4F7~HCfjAXQ#k&|G?M8+p+EQ5GP?tbQGPPoSvxYPnNw&HmESH6oc|1aDNwT7jWYTBwChM);6{dJVz(~ zQVY&9XFGdfhoS)Bs7zda0Bls0r!uWorjyFFP?`82834S00Gw3;4k{Dh7y$4;8~{sI w0eqFYDPwcG!ehcQV`6L)+1P-l&R9aHYHI1|>a+B;iOV%y)hLFZMg&vvKV)Hy?EnA( literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/moddi3.c.0937A263701885EE.idx b/.cache/clangd/index/moddi3.c.0937A263701885EE.idx new file mode 100755 index 0000000000000000000000000000000000000000..65a721542ee78e788ee3b569f0d39412e1a00311 GIT binary patch literal 666 zcmWIYbaR`;#K7R3;#rZKT9U}Zz`!63#Kk2=nOTes4F7?06?2wO$oFS5`ewMtmA zL+$&a1!^i>M-pl(Ew>#C{q}s*+Y=9$Z{M(DkL%>r%3JSV{#wl-@WEhi*!uj>SKmC{ zI7@%k^5;kYdL4Kab)Y(z=l+f50o(yhX1n}MT|zqdbj##3CHZW<{AAnl4aLhZ{S?^ILoe)L@?`_z@Z)2;_&c7-%MibY@F_{6+2*RQ$Btz9GK zvF@pW?Y&b^Kd?7&l{}d-GjK_efYtO9N(MPcH;7xSym!02A>fhAgvl4Q44&+gt1#J_ zdU;}+LDKFOtKJAm8&#-3eQH0+d+M@U*KMXp3zzw5_f9((p1;P!pv=IaCMqr}4<>*z5KxqwR$KvO7Cukh6F5;qf|*B6R6tY= zu1!r;K~xQirzL6t;}sNkc{YlE31S3lVG!kqnJDh{uV)AGTTxe-Y8cJPh2nss z)SN_+&f=ovVxS8d7*s$67%-|?%;(UU(vvC6q^iQ83KM2vNX|{k(FSrAG?n<7rCC_z mBsq9_xH#Dbg+xTfCB%eTSY?3%+??!u0`g33QtC2{iVOg9@%V!P literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/modsi3.c.24B72026862E98CE.idx b/.cache/clangd/index/modsi3.c.24B72026862E98CE.idx new file mode 100755 index 0000000000000000000000000000000000000000..fc7193c4ab89fee228155929c4a79a819327f0e9 GIT binary patch literal 644 zcmWIYbaSg=VqkDi@vO*AElFfyU|oyhOI!kiaB#9xOqTTNMkx%$GfA3EpS6%@Hoyq2ONdurMiH}!`73o1G|*D_ekeGFy4I_>vK z3BQS(;udRemyr4NVA^lLytc`^b=KZZ7YsPOy?n-EiStb}=k|AIN=$QqyW(-uffv6Q z2$-}6eKYiM&dxk@?$p7(F_R~|7TO)3WwbSWhsF%==~)IR78Tlh*G<0u%tRxjw8LrJ zy+u5w*Q0jw{NoOuGO=fxq^lO|!tzcXro&-8)mxoEa*;`GeyAEAI^XXx8=ZzwW=bf1<78_BotSw=fh}<|fGl!#lt6y1Uqg z@6&h~lo=RQ1;hp9!30nS0*X@8iYtK3g2FD(M$s=pj6A9W3AeXzMN%VI%WrTv~y6uNkY8EA-rfEY{_kf$J^hQ!knFo5xjQgaePmK7Hz7mEXF zMpf6oeO1r*O=DtIVNiiNgMlGAHzh|K$W_o(;%Am-VU?5Q;N{`sWET_?5fzsZ6J}wR V1qyI;vhxYZGqFjj$uKH1008H?>0`ewMtmA zL+$&a1!^i>M-pl(Ew>#C{q}s*+Y=9$Z{M(DkL%>r%3JSV{#wl-@WEhi*!uj>SKmC{ zI7@%k^5;kYdL4Kab)Y(z=l+f50o(yhX1n}MT|zqdbj##3CHZW<{AAnl4aLhZ{S?^ILoe)L@?`_z@Z)2;_&c7-%MibY@F_{6+2*RQ$Btz9GK zvF@pW?Y&b^Kd?7&l{}d-GjK_efYtO9N(MPcH;7xSyjQ!pA>fhAgvl4Q44&+gt1#J_ zdU;}+LDKFOtKJAm8&#-3eQH0+d+M@U*KMXp3zz)Dlz~7 Dq|y0Y literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/muldc3.c.8D2EEABC115A02E7.idx b/.cache/clangd/index/muldc3.c.8D2EEABC115A02E7.idx new file mode 100755 index 0000000000000000000000000000000000000000..022c6af35ca4d348cffea16ddf3660d2dc4350d0 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&O9L?s z#`}e`dTz`q+zXis1Koy9e0kj3>@Kc$etNSN+1`p!!jq&=lV1gZfT#JqdjD8% z7H`kha#g*&t{yi6R<{B^YhyU#kU}j$3E1g6)euo7@-A||3y3k*PLpd+Y46Uh>nqN~ zdNI$!B%cL))E-oeYJXkmf=}%9fr|%&?zwF`T=+~*|6zEQ%u+{c4Y8D z%6|;{6(cWx0O0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@)v2M&M^o2}?fo?-4zARaCZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVBb z%S9F@`7FpI_aHlz`|Cm<(3 z#K4W-abpgam-l?99WRQ@IrXFwuB9d;E>+30%%XJzNxGB2%_)%3sSp|OyhR>F-&wv1 z{tHv&Q5(fG3YQYX;F7io1X~mApB>x|Mm3W{vNJ(0LNCE+H;h25@s>;{nsQ2Z)@Xwd zod09cuP8kG0qUsA`*V41VgLXD0CHt!a{vGU0CHt)VE_OC0CRFosjR(WXN;udux@j zVu#xILkrYYxQ-;$R9bF36#DJ?rne^^F5hk-dM|5}$^LEC+w4RcnBkhh zVV_;Ue%Z4lo--nbyJCIs!;V_6tqiIOi(iL0yG%W?`@~N*g<~PszIoL?*5z5TafNcz zHfOR;u3@{jLUsk))pwgNu+5Kn$t?a|B-6L;(!v~%>=LFQ++FQ6E^uvlEZA@#j;<>&GM#fLWy`kn0s)7Ym(SQNasI%(x&57YH$=*9T{>+x^9k_C2_-WF=cOPxN)ePjmN}Eq8QW>@2eB zqgd*S+s96&evqHBs3&F1nXn~60#?&cC~dgeb@pGRVs5$#FSn{6Uy)!GYg^29=6<#9 zI##HUTJa2K28LDl zBwSa8CX2H2s3~wO@WFMdsk5lF!>v%$WYI+8X|re}@pQR$`CuvwpC|4KoG2l|!lNd@ zF2IX0PE|lv45o-jO;tfv4T-0vY5?QGXhtp+-yC~;IZE`wQ5S9=H4!!uPK3Flf}$b_ zo*0`LlAHva1QJh*OA5(7(rnU5avJAb4UdVn}ilED}gONft>Y zo)m`^l3S%&q>6P&y@`3f74nk1Vf7fdyenjD)P5>K8@9*L*Jro)Bg z1tA@zgsEewV+xZil=gc*QRw0okeymW1~9{6G!qv}h5`m6m$ooW?@PVooW2t;egx(N zK_)@CH+a<4nAA96ig?sCm^6@hT1;ASUQudJBFLA;MajkDAciW400Ty~71IR|$^r$rIobIHry`R_kpee-qY zJpEVCryo7+b>LCd0rzB{`xZ+sa0D=!?egSx3F+L^EtAibz44d0?n_ zw8`z9VW`i^!=TK-peiCRq5vjR@bIl|%TETFI`r>GE2bx~?gB1lPb zQF5_3h@k=^z<^QphT7*}mTR0;7*!aOb5nA(fx-%!O8m^yEUa>p9K1YSoa}-^BBJ6F ZV!|w}vOocDPIf*4c_ua~H5o=l1^~qk=4$`| literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mulosi4.c.2708019F9F2F0D0C.idx b/.cache/clangd/index/mulosi4.c.2708019F9F2F0D0C.idx new file mode 100755 index 0000000000000000000000000000000000000000..58b622fc82ccb8fa78281f146d944f40c16a00cf GIT binary patch literal 650 zcmWIYbaQKBVqkDi@vO*AElFfyU|ry`R_kpee-qY zJpEVCryo7+b>LCd0rzB{`xZ+sa0D=!?egSx3F+L^EtAibps>rcQS?g?Baf;Gg9txN zm*&==pCcTe&H@UHa*7JUG#5(yJ)bCa@d`6gwSb5iOc=;h6j4XwX^R-bctxo>i6B#p zi;|1Qfi$CP-X)GbOl;jbj4BK&F#8x7l53nqArVn= a2{B<7R#~6`HzzxvfIJhMl$s2qA_D+Ux%KY= literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/muloti4.c.DC929331B0044080.idx b/.cache/clangd/index/muloti4.c.DC929331B0044080.idx new file mode 100755 index 0000000000000000000000000000000000000000..243cffe6528451fb3c83e257fe9c6d6145933253 GIT binary patch literal 694 zcmWIYbaPwB#K7R3;#rZKT9U}Zz`!63#Kk2=nYoM%3@pqH3>9;hPR#dbGUPe-y|qeM zwL|Uup#^FxTt^aWDlNAi3jOwc(_4-oFW(v}?{S@c`qP%Xm%m;YW?+(2pZw}=?Y24l z>_RtJe*I%qAHg*vp8Lm&-iN~9HLoyDY1q0hm{%}V>AlkN*9{WEZ%uak%9p*1u-gB~ zMrYY%9iLB;8{BgpO;>Dt-f8yZh@ZU0&czAs}nVTdJ41Gr9&_kcLBp&2pP-b9IlMt6s024qN2q;QTEA9s}r@GXg>I!3IWad$m z5RedqYg3a@lu$?FX-gQwczkbHyC^d{Supab@v-xX!b~hE?DA|B{SpKemSB+JhY4$L z{rNe<;pr@(uq3CX5X=xb&4uo+oJ5e;;-chYpvxH;R6zt7FshwsIKP6^;@TW06;%cm zm@orFa&AhFHjt~Jsl?AL&B7`t$-&FR#mO!xBqAyq%qx3ES literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mulsc3.c.4410EACF80EF8370.idx b/.cache/clangd/index/mulsc3.c.4410EACF80EF8370.idx new file mode 100755 index 0000000000000000000000000000000000000000..1134d132108cf4695c8d3515a765e61976db52d9 GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&O9L?s z#`}e`dTz`q+zXis1Koy9e0kj3>@Kc$etNSN+1`p!!jq&=lV1gZfT#JqdjD8% z7H`kha#g*&t{yi6R<{B^YhyU#kU}j$3E1g6)euo7@-A||3y3k*PLpd+Y46Uh>nqN~ zdNI$!B%cL))E-oeYJXkmf=}%9fr|%&?zwF`T=+~*|6zEQ%u+{c4Y8D z%6|;{6(cWx0P&T}A9HzaVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@)v2M&M^o2}?fo?-4zARaCZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVBb z%S9F@`7FpI_aHlz`|Cm<(3 z#K4W-abpgam-l?99WRQ@IrXFwuB9d;E>+30%%XJzNxGB2%_)%3sSp|OyhR>F-&wv1 z{tHv&Q5(fG3YQYX;F7io1X~mApB>x|CN`5ovNJ(0LNCE+H;h25@s>;{nsQ2Z)@Xwd zod09cuP8kG0rN%6D06vjVgLXD0CHt!a{vGU0CHt)VE_OC0CRFk}VgLXD literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/multc3.c.4BB74172095852D7.idx b/.cache/clangd/index/multc3.c.4BB74172095852D7.idx new file mode 100755 index 0000000000000000000000000000000000000000..903dd74eca14e08d73f053438a97b445f4a0375e GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&O9L?s z#`}e`dTz`q+zXis1Koy9e0kj3>@Kc$etNSN+1`p!!jq&=lV1gZfT#JqdjD8% z7H`kha#g*&t{yi6R<{B^YhyU#kU}j$3E1g6)euo7@-A||3y3k*PLpd+Y46Uh>nqN~ zdNI$!B%cL))E-oeYJXkmf=}%9fr|%&?zwF`T=+~*|6zEQ%u+{c4Y8D z%6|;{6(cWx0P-lyB6E3dVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@)v2M&M^o2}?fo?-4zARaCZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVBb z%S9F@`7FpI_aHlz`|Cm<(3 z#K4W-abpgam-l?99WRQ@IrXFwuB9d;E>+30%%XJzNxGB2%_)%3sSp|OyhR>F-&wv1 z{tHv&Q5(fG3YQYX;F7io1X~mApB>x|CN+~nvNJ(0LNCE+H;h25@s>;{nsQ2Z)@Xwd zod09cuP8kG0rS|)D|2~mVgLXD0CHt!a{vGU0CHt)VE_OC0CRFBn4EvcF7%Jw>osjR(WXN;udux@j zVu#xILkrYYxQ-;$R9bE;3cor3^fu)O%eQaP*mE=`bKbV+R4n=b5j5o=7;ZrgiHF*jd`ms{13Whcj6Cg*kcnfukG z&15s#l(%)SN@~Ama;9rI&*=NIWfd0~l`}%lgA!Y!Y0oKm#O% zAoJpJm#w&cDxF>L;gajjxnuxZDAxxO>?P?cgMkfoP zFdsXgD9jg6o#tDY-Y9kC=1~)46XS%b=1~(D6c<78B-kX73D-Lra zFv#R}kpqcEj};-OC!i;Y#FN&OLE@?EAtgRNeLZ;MJNHgHOtRU3E-1B_irB&e7p9ew z3u~5O;zG#^K!=f7(ka&u0iby;?Ha#ww0X%AY zLV8G9N6%2t6ef3?aXFva8IO;^+$PK<3{UhtY8p%$956*ZYFbQMNIV@T9XOAnC^aV$ zN1Rq3;-JlL0

literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mulvdi3.c.89FC644540984A34.idx b/.cache/clangd/index/mulvdi3.c.89FC644540984A34.idx new file mode 100755 index 0000000000000000000000000000000000000000..3e02651f77173898e14efdba3a35dd958c55f8f5 GIT binary patch literal 650 zcmWIYbaQKBVqkDi@vO*AElFfyU|~blkRWA2j`^*^)m)*)Nx^4I7&dQRXM=B%E zEsLD-WOG9Qt;Vc?w|c_4A3EpS6%_eTyq2ONd%A6ln|gzLfX%U%um;)wAFGX-%ljMP+ z-fcBaI_JRa8$1lk3=FCw;vx!Q0w@CkMX71U6+mX;^Ta)Y6D1^=c~nINM8x3QR7Dg; z)RB1FB8D*Dp^d-GTo_KfG6J>OiMYdr3kthD8%4hafrJ@E_+b{oq#3zT98i>+lL%5$ zT$Efa4q~W)2ryt&WuEcy;PsQ60~l2pl5ZccVS0eL1iDK!~JMFs%h1oM;t literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mulvsi3.c.25B42E22DE493BE9.idx b/.cache/clangd/index/mulvsi3.c.25B42E22DE493BE9.idx new file mode 100755 index 0000000000000000000000000000000000000000..6c0eaf09cc2cbcc1ac3ca464141ea9186bec7948 GIT binary patch literal 650 zcmWIYbaQKBVqkDi@vO*AElFfyU|~blkRWA2j`^*^)m)*)Nx^4I7&dQRXM=B%E zEsLD-WOG9Qt;Vc?w|c_4A3EpS6%_eTyq2ONd%A6ln|gzLfX%U%um;)wAFG-B43=FCw;vx!Q0w@CkMX71U6+q^pjlauW7*4w~@~Dc~iMYeG6%=-P zHi~`;0tqvS@WXT!O8Y&ZD0J}(Gf-GSL=2`H$Ws(iN8)LV7{Yiknvn~|0Y#}fi6B#p zi;|1Qfi$CPiPydt$-7VfW>jHNf!W8vker*6qYdOLXe#kDOS7=bNpkS=aB;E=3W6&U~&zV%%I literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mulvti3.c.BC97F078FB8E2AB9.idx b/.cache/clangd/index/mulvti3.c.BC97F078FB8E2AB9.idx new file mode 100755 index 0000000000000000000000000000000000000000..b796d21fcf9926438e078aacf090fe5ce1f0c9fa GIT binary patch literal 694 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 diHM3zhzYZ>$^r$rIobIH4l<&hQ z1MNdk16nH1aQXD7mBvUUop{6(*p=6g4MwjVnoX3K8Mrkk zXkM%G3AB#Ncz!L;f8Cd+i14cq-&7sjddD-EbNbq|DM2pB7klgszIIHE=Zl%z(%%mP zkC(mJTi5wexcE}%oU5#^(#(ZVeB>Mxq#OTkb~Y}1?XrAoV0BAS>%j(PIdg^0Fa2Vy z=bYU6BlPm0h%1w1;vtRTAWW{t88Cg`tSj0qN+N>7Y&9K{L;>*Yb z7KZ66DD3iV6#Wte6c%C-;)e+{Kg!BJTYaz}C@dl%A_g<$+&k$o$!7n#AYl^`8<=XC zG$R*^lM1E%o=+6Ic!d>cwtx`a5Fk%cNFAn!M^%_Zm=D1dVHe>=;%SK(z<3NrsX2)t zD~pSgi^YL7qpDlH$m`gRON|*-7*t@6VPHtkP07&)auqa{_?e|ySmh)+czL)u*#(6} cM8ze4l<&hQ z1MNdk16nH1aQXD7mBvUUop{6(*p=6g4MwjVnoX3K8Mrkk zXkM%G3AB#Ncz!L;f8Cd+i14cq-&7sjddD-EbNbq|DM2pB7klgszIIHE=Zl%z(%%mP zkC(mJTi5wexcE}%oU5#^(#(ZVeB>Mxq#OTkb~Y}1?X!GpV0BAS>%j(PIdg^0Fa2Vy z=bYU6BlPm0h%1w1;f$_xCl&`@9k*TQH4PTriy_fIX5Lo8^~4ARN`lrW?_|+ mkMHW<|0{@r29sP_8}85 z96B$tA?FLs4p4@m-+G zRre%ZSA`~vGV*8&u?VrlG!{Nj+!HuaLINl(pdg?I6F&C#a+K(Uqb@*UVOe1Xm~cU1 zmuI8smmrX81_6Gcv0$)$&d<)DsgY$&K-B`mf-u!Up0uzGjK};aEBkEq!G4gDOu`&6 zVHnNG1$I8nNRbmc!O3fruYgnw35&s0z0^C-={xb_N1(7ElOWs>pf7V0L0XH8l8eQG zG^6JK^nxs}Et;PhH5fEthB7cD=ceRn1G!3?DuS%CZ0risT>N}I+?>K9V&alg5~6JE V@<0JzZcYIqMHUVjZ8>IT1^|qpG1mY9 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/paritysi2.c.73B893623308E5CD.idx b/.cache/clangd/index/paritysi2.c.73B893623308E5CD.idx new file mode 100755 index 0000000000000000000000000000000000000000..96ae2f4c49899b90b1bb580a1b8637580716ceaa GIT binary patch literal 698 zcmWIYbaUIp#K7R3;#rZKT9U}Zz`!63#Kk2=nTr@17{r+w7%Jw>o#dM>Z79(8HMr!3 zqGiuiU*}g+-vaK4@#M-ldG&XP&HC!Mw%_#<+w!IV_a=9n?OUdB#Cra$^a(pEKCg~U zeWf9?vOd16d;hN>296&);>!8&zmqeMw=XTf{qFPhx9#qXx3d}VZ!NBQyii5=0EfgH zJt?DEPKGJl+FNFH^G!SSF5}!o5i5UA!FT4bwPHF$3wm!hOJ00)UN*R^RXaK9xp3;M zlYy0a?wiD#8S0uo73;lV{c&4*Ux`t2b;P|xCynf)O5Vx^JILKBzW?;(g^CdE0PwiA+KkNIdi1HYy>1m$?|9XIvSG1-e8ci!>vh&lrsj7XZ4zb%pU}SPA(b+tw%_xZ z^>X@GY_aDufal6yFTJWg+ z#-;4+#g(~9ioh6a_WbaB@~j1Gco@_e7&HY$1mrawMI7ZBIGGq#wbU6kSQ&~^(~7fz zDhmp`JR3#71Tpex3NQ%p14Y1q`B7H(+3JJ+Ogx%`OoAM6^E3td1Vvyx7|qB9wgRTN zP}=YLM4^jUKt?JEsKHbfrRF4ploS^w7mEXFMopOowewF(eQ;#dV99X-4D$K%%(oPaeDE#i>KerU;MW7-DUl#8T;-on4<1E-()`r1Ec@t%+LP}Z-S>xyLRc;-pS3?JJs}8zbf)G&7FF`D9~W~%C89lN3MO>`RN-u+kC-7Q$x<1 zZ0$y?)|D1X9u|M5A{?pA-E~DO>AkTfOIxnQxAS~ASDx5?#$?SF3+E{|B~m&+|1sFi zy|d{(i-|-b`$d!eY8w^1`GfxbjsLXs;oOk7|D$92>z1xosAD*%{aT{9GB-&c7~+#l zE_<$fxa~dWMt$~6;cpVgK1lJPr`Lo zXtF3!Sd3MS118M(cD0K#qmuRP5;j1GDwyaJD3X8IcvcptwKJ@2RX*X{P6VPm4 zF+P|ukS8G~3FB>_^Rx43YGfHuk+`6^5KI`zlNFbP@t7ZFWuL7+*bj0JlQ`T@A}4Z! zlh-C+0SOC>i^EjIXhtrSfa6N)l;5=E&Ksa=F@7;&n5xr^%lXXCczgs33o{AB&3>tO zoYQyWMUb!vlL%axp(r&c5#;aUqU2(65JLq-fB~cGoB4V7%3~}pF{&^m=ceRn1BDed tmH3&ZSy<&HIe2-vIN1e-L`20U#DrN`Wq|_Roa}r8@=R<}YBG$93;@BfTowQT literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/pit.h.FCBDD7EB679035C0.idx b/.cache/clangd/index/pit.h.FCBDD7EB679035C0.idx new file mode 100755 index 0000000000000000000000000000000000000000..d9935fa82ba800a02cad6608f99e1db6c6b6eff1 GIT binary patch literal 722 zcmWIYbaOk!#K7R3;#rZKT9U}Zz`!63#Kk2=nFoOMCPoH^iaAUB&vP9z;A#J?A!oCr zneD&ACi4%^qh~s|L!hDpAZ2XmG<|_`&A4igUB=Ra(e?lN7`b>EIT(4N#xZzD%FpJzr)dooX5(NJg$cv_#>ffr z6I2}LBcL$YCs1LfH%6Ase|gh^hOl$6bHNOOc@L->>@BD`%u_&NuxFscFs}fG!Crt0 zbFKMs)@IhfXRJKDoa~(ZFwH!?+c5yL8`7a<62%Bs?%8KpfQ-8OHO`)b*#p)6|5d2QGo zo%g+Uq$xjhby7o2dO7!V@MG7`Uhl1r<-U}Wh~~tEGuQ1+zBaR#cJ6W?lJykB=~ivY zLGylfY}`5D25+Tz=~3$4*{&r^bM*1gWrY)?_XfI5@ux3;QGGj4xxmwsVh6CFwdU_b z^;1_gTWD7@V1Nd7Bp5U*j0Ql^`nWJJ)LeMxIK z`YBd|5R2tmlXwcH5Mk!|v4Z(&#;OL44nQTVMTZldOwIWfH9&h9 zpvL#Zsc=*-YEew!c|g4wY%vAYK#A_tEX|7!->2`yMRt7^#jH4vU?3zRi+ih^%^mmq)^A5aNJxfC zWN^E-(fsLzBL%@cK^_JkC z-r5GDeRDkuqJbJDNzmd)Vk0{J3peBpq)D2=nleyHDjA%ZfourN;m&byD3UNVTn@<2 zt!ySIS`n;+I^l;C?Na9}sEAtbMlb;h7Q=YDs7i6F5?=lK9LvX-ATb-%THa>>sll@aHb zNzQm;oX~%(DJw8npF8$L=UlsjLidT+QZ!^wP21w8-ryc!bEGA#LAL+Ls^+ZIe^YqW zm#w*;aY~o1eb0`k`zG)HebTw@+B;*86%VglpV2vH{NT*F<3}#n=LKdDu`KGp4ANO5Iuk~}cPC!bd- z&NGzy$itw_z@RE1BA^H+fHDwJl$uuD4`j|`S%27zO@fPwM^%tXkOQtwRghm$6viuj zp13D)qJ#t^kE(!@fCfysps>rcQS?g?NSHx@A7(W3qpa++)d%~5MoKVAAQ>saCm{mU z3!@pi(A|}j2r{U+D7jc1#83edV8Ez4-K(_Hke#!ZQH3EnHzh|KD6F8V#Lq0v!YU`p l!OO$N$u1})A}TH+Cd|Sr3l!kyWakr*XJV65lVMb3002iy@0tJr literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/popcountsi2.c.E33B79144AFF0E5F.idx b/.cache/clangd/index/popcountsi2.c.E33B79144AFF0E5F.idx new file mode 100755 index 0000000000000000000000000000000000000000..e0810683cf243b71d740829ea62c8524dab4e1a2 GIT binary patch literal 632 zcmWIYbaN|UVqkDi@vO*AElFfyU|VTtTCLz{ zvXi}e)&vcK=8qqXww%7}Wv`dp-?0B)s~toC43o2G{L;&pGdUbMT@qDWcQ$-;|MjeW zEAHJBKd;T$y|Cf^Es1@F^PO}ZIB&eLx+)N;`bp2|KFg6AS<6qFy5HJ8x#Z`O%7}Bz zBxgJ^PUyeYlogn(&mH@rbFN)Mq5H&ZDH^h;rfqRkZ*UK=Inol=Alv_ARdd$qzbQQG z%hp`aIHk+hzGuhNeUo?pKIz=)J~p%?7>qe_Dr+v3gL2kFBHkb7hQN`w(O?Qb3es&ndnThIC_Gsgo|fq9si#B zIX5bMOe6~V14G5lHYzsz2i>!q9kc33eAl=Cy6dj*PihsfuQ~c|LUCnok~}cP*EXdd zJ(Xp(l7~T=fk9P3L_iTt0A(PcC^fA(3&<=e?DA|B{Sw5;qbk54zz>sVew3Acw)$W{ z6OXDOlOPA&G*v-9K@k`aMl*7um|ZCC_k5zz#Va5ql>{_ks)|x`5<$in7bO>q18GLp zn>%}XKb%`$zn0<)NbAvrfCM;pjh&{X1QmS$m97 zmPyWdVw})_t0^lmSD!ofL+4z(f?Qq(5 zZxK)F^{AaZ|JZ}4OzfFv*%iX&^j;{Eg)h4B#%$S5pXYvx@iNhwVsZ2YR|yx-&N}`* z^K))g_LxW%@&|^Bn{8BV_7A#eH#=t4kNB={|8>`0-=EYfUSAjXZc1@wZjwAO#LZT4 z>-_#&oWR4N%)p>3EF!E3CV(;!P?VZh%nXc?sV;S=y22P48F^HNm4r25+UBvWKkUUO z!NtU*D$gX(0TTxD_~k`mJifQ9U6dJ}EP#6X+4)6bMi&%zc{YlE2?80(Aj}UFhUsGD zLU9T6qpa++)d%~5HYqYGBH5(Krzir`vvN~X4AWNb>1;fzB1|GkibVKD;LhPu6%!B> zgK6PWmE@KbMDU~pq>$ufxnu=katuYOIf)=w78fNKi-Q;{AOZ{+RdZ)t%<;d*5yYs% zker*6qYV^R&{X1QmS$m0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAO0ssJboTZR&PXaLv z#`lHF1PP+ay)dW=i2^YgUy`x)?kf9p*>(tidJ9XGx5i{?p0<0|{w4qfJj`aB*SE!b z{_?n4EH_Wj%lox};IU*W{R(FGA!VjvSYEZGj++rv=%Yq36f4=M zC@pQJwR);e18DmO*ZU0;S9&@7d2VD zlkz{4e$*g{Z(kG4OLKW`VgLXD0CHt!a{vGU0CHt)VE_OC0CRF literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/powisf2.c.E7998BCBE33C5284.idx b/.cache/clangd/index/powisf2.c.E7998BCBE33C5284.idx new file mode 100755 index 0000000000000000000000000000000000000000..58a1f8d3e5f7a615df333cc95c49c6e32d7f9917 GIT binary patch literal 466 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 O3&2-1YauIK0Kh-4ZK#0& literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/rt.h.4DE1465D2E715A49.idx b/.cache/clangd/index/rt.h.4DE1465D2E715A49.idx new file mode 100755 index 0000000000000000000000000000000000000000..cdc148fdda89732da1accdec8924b34440b39488 GIT binary patch literal 1192 zcmYk3eMnPb6vofycIW-rb-Lyjs4UT@nP`PpOTmvYBu$J$4Hai9iJxsNHADR9k1!$> zD~uKfnSw^Ch!GKCh@mcNXrYBAqFG5v;u2Eny>~m*h5Ovg^PKlR?|XhHlarDyf^lSq)a> zX00vqe&zS#jGmm>yg$x0lV4ST&Eq{o{(Bp{F9e6BK09x;e|zQFD5+9h^tGOOt2^Yh zw=~xu(0Z15=La@j&88B*zKQwV)fVAsj@o_0(3(OwsZQJLemYk=*QZ8%726drniI1& z9ZIWTqP}M7R;aT#!Vz_;aHF>L;l5G%q~l%UqIs~qZ8jji)nw~mt-ah^V0(}kI&`h} zY1^`?v0_6$Qdxf!EH!2MGvr43s)>c$D>GUi)D*CKO7ATSc#<2FN2U)SlpVeo#Djvw z8djqg1>-MSW5%4{6CphKkl2Uv@fHPRe{P`ZVBge!4!m940UII@Q3CBD0bfrEE6-l* z`eBIYkMO{e^^_;276sQ&Kc754kQp7zgObD?%lV6f@%!Atg>$K=;&`A*tYdX*Q81os z2%GIo4?4<&hQwZ!mqrwf+e^wL5*!&RJZMQANChfH!8q+o#6X?1ER_Qlp4}ifa6rqX zuCtFHo1cq&Y0Ttd2U#CL1*k;9^^rEsiTIXZ9X#+Prdirg6pY7aEgz;w*+&$}0a%%r z%vThk#b#tQQQ_kw)Zo}K3tprkSQ^ZU@~>c*ZN9xHlKaGijx-3Of)t`)127jBS-Srt zEMY{l*cizYTfmAo5+$~P6Ky0Zp}&wAPrJ2pulRRKx_d4+V~~5FnaeMfHRjeu35W%jx{I^T5ODSCu@bF z<5o=Xsy*h;_L7WaX(`QMV{(5f$KXIXRwLCgIC_rNNp%cP#aviw5*k{}XDwRchwWUa QTFT--MoSoA1jF_G1u2bFsQ>@~ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/rtc.h.EEC94DA1B55B20C6.idx b/.cache/clangd/index/rtc.h.EEC94DA1B55B20C6.idx new file mode 100755 index 0000000000000000000000000000000000000000..79a7c66345489bbc97d5ed3f96ef12534b81e35c GIT binary patch literal 364 zcmWIYbaP8#WMFVk@vO*AElFfyU|uGzKE z;;LNtc7e|3TE%d)2z9>?j0+xnuPLs~O>zRd=j!kErb&h6ZafU^KpqINv9hvCGH^08 zGH|jmvaw3+NUJ~5DC*9`zyXnGU}Irr;bq`tVuC0rN=++v1xmq8V&sIF096gs4-^LL zg9^)(O|4k4|Az^qAf2YD+2(_ Cq;0$a literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/sched.h.E76F87C7BB1A08D8.idx b/.cache/clangd/index/sched.h.E76F87C7BB1A08D8.idx new file mode 100644 index 0000000000000000000000000000000000000000..3a4216f2900cb2aa79655459e5b7ce978d9415e4 GIT binary patch literal 1850 zcmYk53rtg27{^cBd+F=;-j;jmi&h4-ol`_mvm#?G1BPO0I#FvTqT+nvq?v66=4O`h z8jBI6>YQ#G=e9Z!664!!4mYzZMh8yWM8{@kWCkO%C~g5AJNLGqc#?j-`JeCcKll7@ zQ9*wGG$}&4D+;R0SNcl{gb<5=KEJnYvj`zhf>70GJLWoF;&k=B-lgf%*bTYsxSWd{ z(>41|mi)BKSAs_+?dxthi`}wt$BmNj#NNbS&+ni9y34*Nap9Jp@(WhqR(&vhLcXP^ zBy*w7fBg+KP3e*fxS&-u}F%eoV?wl(Ly zo;2%Pa59rq*P1j@!nzkpE5zAp$stF#d)b3OXH81|AiQsmw)<>Tp5)d2XB|u^rsX16 zP1@~t-N}Y0#*Bf()A|le1Lm)1&2Y+H+d{YQhwm6&qv7qfU3(7Jtk~}@eBrB~*M8X; zS9Ha`x+A@6U_t7gl#1$^!;SOW%UXuFWIcc2_|mbi!o?den0ETt|IwLQ-kR4ywq9b{ zzj77U*`F5-*QYcoZ9Qu{M~?kgY8tA)nNz2lze;-d+e0Z^P4t~L{cmM=-8y#W-<0_2 z9d&Dn7UlLAj}J+M&e#XY_fGlpS}{U%DvbkEj#eTD$?#<<2_+*0B**tQff2FfR+&5P z@u3zyh0Ivu7n@8bGe}MlN~;Tcw@8IFk$l9Ow59~X;Bz#d zFK+IBG+lhC7+b>L6of)8gz*!Mp6g1VRC#_ejkI`xA>NQ61Q?K1VBh`sfw~e3#lrv# zV~Iy{QiOy7yB}|C8+GNaP$2^(n6>6-9Gq;dcAriSc$6psJ1~lkj1U9|2w{t<63Nx| z*K_?eO2Q6wv`#MsaNy5wt-d_JtvUu#xSnQcvk=DXm%BH~0|O5?E71g;K#3`h5XKWM z|D17oc4RivC=L%`3uk=ONh1rc*T^)K5TO3OYn{c8FUEQqq`>y%gj^$p@f&Cu8>&?V3U1R# zkLx*x(+C0Ty(?GwLeH=$QbZVxnz>Q9&ob3qufsAaBf%m9Fh%kRkkM?w5z7LGQ5hh_ zO?U#~m7hwS-QE}5GZV`(vKV7D`6-iF=7EH4U=jBg7>uR^fjFDT51IgXSmvRFCcqnR zB5)Q>2gU?1`@F+9z*a1 z|6)aiyr)wPN`nE;0Tkj|9>Hi10`{=Xg9ojEIV|(Qft>o|WMi;@Fd(5=Eup30L;4!3}TrhI29CoSFS7N8~VI&`jYvF ZSUyA+2M_o=$%xyvWNGC+y*QRb{{ydF^wY2$VEOlF&XaS_PWr>ZsGz1%&g43UL=dyMD7ly$#9&dkcwKDGBhAae006p1RmcDU literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/stdarg.h.A9A08A3B143D24C3.idx b/.cache/clangd/index/stdarg.h.A9A08A3B143D24C3.idx new file mode 100755 index 0000000000000000000000000000000000000000..bea4009e4df723c2f4aa7811b52b8a2297bcca62 GIT binary patch literal 326 zcmWIYbaS&~WMFVk@vO*AElFfyU|4Yu3j9iT3T;hBnDG=Cn|Ezu2CvkJ2undup@wUxc?^Q{;d05Wt(xc~qF literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/stddef.h.DD16386422A95BDA.idx b/.cache/clangd/index/stddef.h.DD16386422A95BDA.idx new file mode 100755 index 0000000000000000000000000000000000000000..2e55d41db4c10dbd66ad81c91dd74242431bc824 GIT binary patch literal 416 zcmWIYbaR`*$iU#7;#rZKT9U}Zz`!63#Kk2=nQ1^eABZdF==KD19X8-OTD0)Y|D|tu zb|2LEXnbzkmZN4OWxtj#jThpWlE$BQ!g+qCU6)?jtSfDu9VM?7qRZZX+4Q!#;M1)c z`!mnKb@5^IpXqD9q2nuLKi@ zSqBsb*##5MvKFk~vb`-6D6Gk$DF73etvy%pWY*a&Kw)JrWj>g2QEE;ih+SNiT+9t( QFvlFZYS7qP(Z;|40Q(1PTL1t6 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/stdint.h.465D5E9EFF387506.idx b/.cache/clangd/index/stdint.h.465D5E9EFF387506.idx new file mode 100755 index 0000000000000000000000000000000000000000..dff84ee56afe0e21fb7c3bdb5e9072940ccc1ba8 GIT binary patch literal 3386 zcmYM04>VQT9>@2-GPARrF1O;!y|;^sWJ#?lH3_95Ci5aDB>B@Vrs0WRL&GDb&_qjW zN{yN*MZLxtHI+n@e>Gysyp|}EQBRH0ko>FO?;LC2z1Q-y*7y6l`<%VcKHuN*a&vK6 z@DW1Jo7`d}G~0tGAcUsCU(ELC@N@A0AVw(mgwMULdcUgmCv*f@ZWvK#d+pr&SiR@k z>5FlvCJzjGEOZ~te9@5+U%zanrXbcf(`9{)o!Nr^+OB<7-wq7)9}hhh^!;h+Xqqy- zLD8B2aNXAIjqR7EIj`+^B#brm&uQq*dbTh#Q2Ik}{u;xzmaTKL)1M|-obh)*f7$Ed zmrwiZzneAkIyuC-@`vX?zEa2QI}y{tm8;BW%Dg64uKd^O6^T*zGqPjiB0^5+AT*|`bu4)mr(%3>qR6ckMd zK&?_+i-iM=0&BcXQo_^}83Hg%Im=2c9GI#(`j7mvqPY|q0We!R+e$1P(24$L>5^Z& z9VvqCmdrDnrxFVXR*Wo)?>f}FoFW4Nrpc$N#lnFtc2i!@e-OTgqGbpdU{fU4M%F5^aA1~080nj|Ifx=%02UZ6P>F>D8js~Sb`_ruq38nu<`~XV zh=l{@_IdqxeB(kXQUIV*s;tDqfiEn|U7Ir!q9~FBV6HH?6blFT4c-2qx96KZ6io#{ zW+YRIg#)$69b~_M)wYi!IHHop%EeY<;lMw?2wArI^^H`D2mtm9drPr!;HQGp+~Sw6 z`zewF;3{`ji-iL=Rdc7G?e5K@!m*c_$W7E@;lPN2g=J(!V-6K0$uh+QI~L}Dnj&KWW~gRZi-iN$`Crco&ekoa=tBUODwbM`g#*WH zxAwjo^Sw^dBmnG`c2;8Hz^%9k39=rCN{aLV_{8Ls*<#^9a$TzQTZ6V+6e$64F?KN% z3kSZww92ck8bV+!Fp`Q6_>*xR%oV?9Y4rfC?C@c3XaFBrm`%VhV^)L-6h^PLECGbYU# z-m3Az-eoX^7n#Wp`iZ_lJCDgg?#84W!)rP|GKS=v7oTaE0!APW6k<*s^swjNG@n2d zkP9#^z;GDH2a5tQgdAY9I(wkp&f@S4kRM?3fZzWTOJ!X^tgRZ102-j3p9KcULRzqC zSWJK{WCW9a$1YrIj?AzI`7S1R`D*)C_;nu`P}_h}ib*Mkmuh^RSETu*=OsFV(TYhc zUoXoUFocj{yzTyqJLhkhJAwQNlSiCqu>*#XIgEc&aVF`|&DHK8U&Z7qzc9*qXfwe( z+5?PK2}zYeSd9-BPhbey#N^h(0z=wW=MC}|Os?>WhBC6NUCy2K2jc*y2l$TmA8hH* zkm;`n!-x97!5bf?=JhyAw^5L*Fsb4zC|)zc=HwqO0brD2QpOFIhhPX{$R_f4dr_>m z{c|J8yD;6wA3cjlFobMm{7B7{(zlOeLqJZFkR*xrXtA^eLx@Vovy22;2uLQEwnl{| zZ>rw{@>@*aV(n4c{c-%_+?^wWaRk#N{C-%Lf*}McndF7guG__w%G3i4Tq%K-TnCb#&jF?Z>wD_p|=oe9PzOfT_ev2+JRh;}xS#nu~By?VS4gIt1137=@P zPq3|%bD>~ps74zEM>U1`cTUH~Hx(>#7Qul~8^ z(arfgE`rgCNhg2gtbKtY^e%RVY>iQr>5pzDAg5rO!jF{W(~&}#uuG+aAt5PzVSjj^ zNlBJRT>~SC25GmMbw7}W*2m_zKWVf3^VZ}FkZUlh;k(b8As9j@WIStuAPfDE$q9AW z%a7hXb{pg-Oq%#KtRsRUv_r-lePm|#S42|{$Q77WaNbGx*zNyRAFKtV1CtKE-u=($ zQ;BEQ9WaV8E#jy1onJz^m(FJmV6;l^e3#zsdhE7+IKR@n77(ZxlG}xV{aHMob#{I?jFS zSKeN7xg88o>Z#3i{n>P8QKGC9hS74N5QqFI6UG)b>k5}FO z8;l`LhWH_7-y&cLA0q6Yj2}tda`lgnf-EIc?GbQX<$e8->&y2bk76>)_b6KPRj}~e XnCQ?L__%}5ni_{t>+_R>_agLvCrapM literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/subdf3.c.7B4DE2500F85491F.idx b/.cache/clangd/index/subdf3.c.7B4DE2500F85491F.idx new file mode 100755 index 0000000000000000000000000000000000000000..ba1c54d3304f41c05bfd9a3831d17c397ce5cd8a GIT binary patch literal 466 zcmV;@0WJPgNk&G>0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@4v2M&M^o2}?fo?-4zAR~SZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVC` zt7R4@`7FpI_aHlz`|CmA<6;iy zOj@tdlzR*gX>m*ME^elayDY68vk0i*+dIrzj2A)7&c{SF1WT*-x~FEq=!YN?lnx~y zV&F#C+?a#q#XYaJUor9Q2k3Ol?{j%=VgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@4v2M&M^o2}?fo?-4zAR~SZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVC` zt7R4@`7FpI_aHlz`|CmA<6;iy zOj@tdlzR*gX>m*ME^elayDY68vk0i*+dIrzj2A)7&c{SF1WT*-x~FEq=!YN?lnx~y zV&F#C+?a#q#XYaJUor9Q2k{Zh9CLYXVgLXD0CHt!a{vGU0CHt)VE_OC0CRF0RR9)WJ!2!WprT#0000J0001UbaH7@0RRAL0ssJboTZR&OT#b_ z#`A@4v2M&M^o2}?fo?-4zAR~SZR7H%BqbpfQT|_?;_<*K#WN^rCobU2X}5=UvVC` zt7R4@`7FpI_aHlz`|CmA<6;iy zOj@tdlzR*gX>m*ME^elayDY68vk0i*+dIrzj2A)7&c{SF1WT*-x~FEq=!YN?lnx~y zV&F#C+?a#q#XYaJUor9Q2l1rKA9HzaVgLXD0CHt!a{vGU0CHt)VE_OC0CRF`ewMtmA zL+$&a1!^i>M-pl(Ew>#C{q}s*+Y=9$Z#Pihb2KG$-nQy(|FjrbY6dkUK1FVDf9qhnqHKDr*^eWB@;i1c_sBMy!k6kCwOIH-e1Of7maqodev2!Prm6Ol zhc$z*Wt%+ZYj&2q^J(|w*$kiODG?JZ7e(p( zz_wkvYhu{`w`!j9a68?jG_~o%P8YGpMD4b{w-l4N-^-Q~^O_@2BpSuq7IU5XyxR6R zR*!hx-iU{O%@&k4`l0ajYyBi|(f5lp{{25v`Nlr9;v=&j+w%&B;>z44d0>c3-ktAr zLCuz%he4TvK~+dxNC8X$Wgws^HLds_kU5WK{b4UQ2`(lcRbf715x6#0VJTq+7!O7> za-kSf_&jk>;6w=t79Le00UsEV

L=d~U zD7jc1NHeOsmq_jZr`39qQH4PTriy_fIX5Lo8^~4ARN`lrW?_|+`ewMtmA zL+$&a1!^i>M-pl(Ew>#C{q}s*+Y=9$Z#Pihb2KG$-nQy(|FjrbY6dkUK1FVDf9qhnqHKDr*^eWB@;i1c_sBMy!k6kCwOIH-e1Of7maqodev2!Prm6Ol zhc$z*Wt%+ZYj&2q^J(|w*$kiODG?JZ7e(p( zz_wkvYhu{`w`!j9a68?jG_~o%P8YGpMD4b{w-l4N-*cA|^O_@2BpSuq7IU5XyxR6R zR*!hx-iU{O%@&k4`l0ajYyBi|(f5lp{{25v`Nlr9;v=(*?DH)Q#g(~9^1u);G7wOdnpS)d$UOT+FF;mIN0Es|Rg6tc45p1mRgz5-&a+x% zH^Xk1i7yimSP{$&9M%t>p0s@|yXvgqzF{&`Az?{gyker*6qYdOLXe#kDOS7=bNpkS=aB;E=3W6&V1%)%q>~ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/subvti3.c.829111C90A78F5E3.idx b/.cache/clangd/index/subvti3.c.829111C90A78F5E3.idx new file mode 100755 index 0000000000000000000000000000000000000000..1daa3177bdb61812d89bc984ffe25bb0b71f3ff0 GIT binary patch literal 772 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/ucmpti2.c.8E1052AFD84404FD.idx b/.cache/clangd/index/ucmpti2.c.8E1052AFD84404FD.idx new file mode 100755 index 0000000000000000000000000000000000000000..a2450dc209d1b3de417b909b3e28ed04ed1e40d7 GIT binary patch literal 980 zcmWIYbaOky%)sEB;#rZKT9U}Zz`!63#Kk2=nTd=H3_F<^7%Jw>osjR(WXN;udux@j zN{8C_LkrYYxQ-;$R9bE;3cor3^fu)O%eNaS?>U;1Id5C_wtrd-EH=K&ul_z>V_IFk z?pgP%r==fv2yKwy`mv_>VaIQgEJm*bZr4|~b!bg2pZM9=p=V{;te9e->hi4ExI(#U zn={4Ke(KykiIyls6ZvM2rEnRCaFnDCrlTy~|eSsXhn+fwoz^)mKQQ6-_XC?x zw#B;7IoR=c(W*M#Bxg4HC42t)7p;6$EAsaLe2f0S%enOH7>ui)cQ6!J<|fGlL;UWu z={Mf&EB?mApv=IaDk3hT049Jk5KxqwR(uQ?BMFyJ$2Qe&F=pXWmE@A-gKJZj6qS@j z@T9qsRBrQvdXZ&$l0Gdfu?@~HB$^NGUDFDUHtY!v+x1QZrw5aEXj?^TG=nYc`A zGSE6%E?HiL1+pTt;s~BRmpqc3yofwpZsn$=7^bb<)0u$gDvGEhw1{Yn7{YkIX^M59 z>NIC^06oPa$q5q%@`NQt5IkuPX(TymVQC~eSq@nwIawiDVT3+;4tXRwc_DeYT%okz z^NB(iuYi0lAR-3SQf?r-`b4MIHK3zKnM9HFiZhABdB-2eR_H7&egIS?#v;ZJ)61hO z!6E_Y!9*FkP@=OaH75}i#KlF)#o|DkQFT$t&YrG~X-64V7*t?^&%ltJo06jqA;y3A3=u0tL7^+4%(Inb@S%WEd400I4dJi~s-t literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/udivdi3.c.561304CA1C1BE0E9.idx b/.cache/clangd/index/udivdi3.c.561304CA1C1BE0E9.idx new file mode 100755 index 0000000000000000000000000000000000000000..acb64b55edf19657e8d19293e396148da9a5cfb4 GIT binary patch literal 822 zcmWIYbaT^VW?*nm@vO*AElFfyU|7FK370Rlmu%`BIsbB8MCkOg*0cC-^ytAU-PALc6HYlHRqR`b3C$3n0|0~%{N>qnxLM%@701?o96pH z2+(|OI;*Jtpdx?X&GM>3)4k^|+_GzKklMHBaLmyPmN_?n&amKZe;OE_HIql8R$QcM zS->ehw#*FO-kZ^uyC!BAZPMsVe=ud`-D#c&cb2SlTgo;Vgg zWnrGQc6`(S10ty^i&OiQrZ!#J=_1y6I85eSPU{|Dn_&o?j9 z^oV3{r2eW`?n-7UAHq(3{;x7!>)VPG+m=a8`=zgbFX!T)yN`A>@P2KMmvWeXQ9rWc zBk$!`oTd!LmAOf=z&Lnz!D(G@!dq5u26YAoHGY16aWDat0fU)O1Aj9#6bN!NXaJ@8 z`1vHj1WbC~sdKtab|-G~Fen41MZ`rEzywU1p(r)2_%x6QvxSih#q@bB>koUeNpP|7 zsPS>|@xd(PQ4OXzF@*78I)LVa+y=9^@Ok2%z=;wPj67=m9Q=GR z+tZZ3WV8R9?FkeX!If)=naZz$H z(ANx%YLV(08=bx<{a{j6VNijqV^BpflXFvYw1Hd&O(lM2X%<#FNe*5fE>3nqArVn= a2{B<7R#~6`HzzxvfIJhMl%@=$A_D*iqY>Hw literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/udivmoddi4.c.70F2B64E31B6BC69.idx b/.cache/clangd/index/udivmoddi4.c.70F2B64E31B6BC69.idx new file mode 100755 index 0000000000000000000000000000000000000000..86c8a2a339b903834723a262c8448cfc686b5677 GIT binary patch literal 4322 zcmY+I4N#N!9mk&^Vhj&|2qEN!B!rjnlBbDvG6j*uddCHuZiflW^~^R~9hj793MA=T z<2+szQc%v9NNKOd$RJmDZS9g^yNZtKbhpjb&em-`)^#4U+s>ZWcDh@q>lWJ!&zI*e zm;2=Vd;7otpR_ufo97BRuBqMejDK5bYc|Jmiu5NK3Us_k9A{j@anHOo-nx0aZe_uh zjh{9d4j;DNDU6;P++}()cd#zMDt;hhd2RQ1KK|>$&@VfF)$`8Wxs!LFKUeNu)%eQz zN9RAf5VWms`o_8gS1#W9$NcAidw6VFc-Pb?6{p6`-8(HmGn9P%#gBIXdXy`;wX<$} z&%M(O4C)fUa<62YSr5pUSPh8!2YtyDjYJUF0?uTD^ zuWOUxpKe)q{+2Fyc<9wbRl`@b^H;y#ke&ah!29)$*S0)y@$Sl1 zC#Kg-nX+zcEuU{)WeqJD9@V@S@-}K-0A;bd3vnwmd`pvqiZ#ctKv98tJWG#4z% z-G+22Up`C-d)cyCZr(K6MnzYdj@iSDA@xITh8PaDs^G*DhZOHg{bq_oGl($5JM+IoIHM6vUBB&8h&$6jVH7yX*~X0UX~ z9FW1GbwGxe+!iMKwWwP(A~|^{L~#~5m7?b2U7)#?E~v#-?y3+i-7+_1cbB_C^T<8W zFCL?(QuJ$+v@H{I)chKM zu}GbY&LSW~XQ@bC`CT%R0?GjNOOOvjhM+PCT8IyU7E*>#YY43sV}`54H9+;@H6r!! zJrJdr_+DDX%3gxFeZ=>n-cNl0VlL_@81ucv??rup_<_Z&9KiU4#1EoANXkLfBg98g zkB~C5SZ|0Bw0wy8A+#T&q9LqrnD}AThe$_8lYs80r(mPb}u53Cur9{3Pm=q@2WfQ^Zf9 zK1IqY)Z@g*QIC@{zF2RFV}B<|k|0<;2`WsGLTqn>Dic&Ca*`xTv`>;eNwD6MRFNd3 zXrCfU3hh%=n8Nres!U=0X_8E%{WQs^#rPlWc=N^&4R!kpm|(~@K-p#4Wk4I`8(;`q z<*h)Q<(q-J72U8{o{~QW+88OuuED1ZABdX@ATw!^_RKGDR_= zC9g#eRNMlGql>v9gG=p#3@)P!HbS@D4H?`UShpCu6@M%ko!s1PjKZJAU1&dAhE&4tR5uD z79n*6d6?KR+7FXvSiD^^VL!3`sE?3p1oKBp86`Lhqf`^cc^)GcL;qvMjv-HwY69a; z5}QPQirCa*R!?F5aZ<;T6C_O#j97w-5(HP6BvmHKB=&cTq$#vdQBg{?zjRagXz`wn zxY%usqBP)?kwwsjlHX&3yz6^Ish{`#6nPKs4)cZ4PjFl_RJpE1D3s{?!}qY zPpqFn-%D&S@&Ks^&^|&ef_j7+BLumJhz+4WM5-a2>HA2t4`<#8u@ST%Cw`n@9Al)8 zVg3nX6KFq4>Pgh&#Nw#OsWFcAC8#<RH$3|~D=h*C+EDl(jYKi#qQJ_G}8L3R3@ggs~T^ylYK#mK~& z7RK`yHF>?P0 DVm*7} literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/udivmodsi4.c.8138533E2886502D.idx b/.cache/clangd/index/udivmodsi4.c.8138533E2886502D.idx new file mode 100755 index 0000000000000000000000000000000000000000..3fcd9d9eb189fb469c4fdd497ed5f328ac28c3db GIT binary patch literal 764 zcmWIYbaVT{#K7R3;#rZKT9U}Zz`!63#Kk2=nHv}x7#x@x7%Jw>4SJt_+d$yz{73w< zTNbCE&CS@{VBeF|eBj!YOBegyrs-`I`)e>s=F-%E?`_>vPTG|v9H}mUf9`u<^7C~4 zt2%tWWh({NPd|F|^wq{~)m60%=Ps)gh!>u)ynRUC>t1#)g^IrRDxArmqbvpih#s#Ad=E7Aj6Jqzy zzIR}r=WEefRm}$#dGl7j|8n{37c=MVa!Hnu567*~=p0j4IDhWAOWp~c-dnHdO=4Uu z-{cZtb)}}GQTlFC^0sN=^D9@&>YsjW{%nb0p0B6dz7XBjTFqOfIVP#CKdU+6!b${PpTP>Y?+a(QNs7SuTf9qqf5y-E$~+8e3=EnA;sVMV9^xL# z44h1is#@xd8mtUOscFS?fht|hWmQ(p$ya3L(G=tr6oYAm(TrSR-9Uw4P*B+A*(mxY z2&h_sL4Y47%={=T`)u{WeiopxfB@VOAWua=3uY9Mrzc>7#Iq2vgYgQb{hm)0x_AZT z3MN4gm@v?lIf)=kii?tq#ep=V=DdWwg?1gY%osHoG+@>wE n3esHsd_3Ho!Xjegl2Q_)Z0zzt0bXuS0U<>e4jFAZW@QEdJYOon literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/udivmodti4.c.46DA76158F034612.idx b/.cache/clangd/index/udivmodti4.c.46DA76158F034612.idx new file mode 100755 index 0000000000000000000000000000000000000000..42415cdce6f10da5b27ce7034ea08e1da9940cc7 GIT binary patch literal 2440 zcmY+F2~bl<7{}i}fk1eD%MsjRI8;}JN7~6>apIV_SC|~P@Ac&Cq8OsgD!vI07vk;`>v#yNQCBD)88^(<_Y&>|dPx{MnXsfHzptM$Xk-r5QC*50zOhwmPL{et-C*KMaO zlkT(PT$U3lRYJa#&ycXTXYsXrOU9P22n!wGYuYJ%mg8TE>t*BF7qRpg-nmVq)$7_u zPn{Tb-le$CI&tS|Pl>KPq5V*M#ys?|Pns@lZw<*U(#)^m>o#ovad*+#$^+@&tU802 z-pRW=_3F|awS7dUbWJ-OHIZ2u-3=;D3q#8{7xoQz-CL{Z`DGwLl;W2*GI;va!=2HV ziw#>3jx=q#@OVNbv=4Ax++H{DlQ&?oht+jE=Eu%aEecl$AAFV7ciMcYVDik{O#Eoi zmi(J+A)55K`5603X-(mpt}_V-CgXSQ-LF+uO6DPnAbDUM8I|46eK52#deCF+Sn==X z@0^D@gXEsF_bL}W$*yg0y>9Ne{jobkB29}g=nq{**lOzr8)9ztIBSngNILq@zTb5F zZPfFQM<*u7%Cpmdex;9HDq~IYI==j=Yv^bo@!L?@DNe`@#JEA1w}#5{`8Ss_>88Jx z7!rygxK^SKlBY}3gAg|qgoMoja%Y`2yY>9s@k9)XpbW&G;_#V{nmW_&-e1o>sZZ#` zkZ?-Ycxr-YI$A~y1%<}*E(p@L*!Dw1762%QHv@Jv;5!22Ex@e>@M!LKI&v<}#f$BM z;bN{>mk$^N+<4A=AZBH9YW4SWMcMxjx{XoQl8WymZrdopAZSYQgW%waUE zzzS*BAS_6a2?>(0Rhe2XT6JqKvF!lWiE^BN$-u$4z=a! zyGIXytZzuI@_d;=S!)q3j~+f5kQ1@(i?9|hh8u&8(8>q_0i6V)CX(s67;cI-#XzJs zL7FAT631xP7%N1ifP{RKY7&}fi?%^NZE72&)dNmFeE%B(uMv1KQCb17mEi+N^K#Iy z+&i49o$|F}#!MTm4TC6B3kB51YZo$FzC1sYrlo~}wihL^PzSh$MzgQ6>dMDifrcd1lCqg=c{&&@!8uXHi<_GGygh zAxmqZ6|%G{t&k!RV1_)Ta-<~M6juBkY)!mJMd>zJ5bpHq}KuWI)E{H zJ#epwxe;(00hiHR0jHJW%j3RT-kX6Jj=V+_w%<~xY43bWY%tF2TfBt$6V znUs(Y()%uZyv^h44a%=S>JQbb8i3XSS9+3J;n(|peZq(nh8Lg(ZuBsQ7okNE6{E!v ztw+~8=)%L*6%l)k_jwpz=w1kIa~*pfhjCZJEpa?_3@`C331BpxSm(`96_8W`ABL-e zs2V_Js}`_p0pz&_c((v4W8VVgEg+oXHo$3vA6pxcw!!Ia2Ut7v@xky;AnJtU?EoG- zfTQ3U3QE^b=g4T#8YRh2?(JNn|RGoElO^xbKE zv-QqiKc0i?NxvLU+PcLoKKSLzw-r;$cwTVz_#0-PK5*~e1;wT}w+qX-+dZPzZ^Vd=21&hx+W(7z@%}aj3 zcKyzby-&}w?{ho;`qvj<)6ACJK@%tHUp=)7COK{Frri*SmhE$)8nkFSuBI?!FzH?Vi38t1Zndm)riIE~LBr-T&A}TPE}N zO^%!8pts_W>YIH3w>R_IDwJdyiYs%I;(@Vu^PQ@Yo7xmcZU$`z1}%PmesM4XlmP=5 zb6J%YbMh5=7}S8$BH|(nnr`B53Jjb~jH zhN9H8;?qDL%pOKAtmXrSL59P$r73;MX8$+alaWVDlv7j)=8A&CF3(2MFF``#qm1 zbnyz%I(`m*KA0DPe#%J%SyEh-T&xUYXn+VXVAK+rsMs%lY?&vMrUrv1OqhWoIX5K- y7{Uxnnks^y}JlveZB4Xl_QWBzU?D9YXUT#hSAw?Dr89g~>Wd;CazBN1m literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/udivti3.c.E62428D445E7E7BF.idx b/.cache/clangd/index/udivti3.c.E62428D445E7E7BF.idx new file mode 100755 index 0000000000000000000000000000000000000000..ac9373459a817afc8e8c64123145d6875070b3d2 GIT binary patch literal 670 zcmWIYbaR`=#K7R3;#rZKT9U}Zz`!63#Kk2=nTd=H3_F2x6?5iJ$oFS5`ewMtmA zL+$&a1!^i>M-pl(Ew>#C{q}s*+Y=9$Z#Pihb2KG$-nQy(|FjrbY6dkUK1FVDf9qhnqHKDr*^eWB@;i1c_sBMy!k6kCwOIH-e1Of7maqodev2!Prm6Ol zhc$z*Wt%+ZYj&2q^J(|w*$kiODG?JZ7e(p( zz_wkvYhu{`w`!j9a68?jG_~o%P8YGpMD4b{w-l{?f4dxZ>J)Zb=d}93gx6IMZa$e7 z>ptgT$KOS(>U5Kw+2oh(`R8A>@=>kG+5ht``u{HH(ywE%jCwwUp|~-0A(PcC^fCPAILoR=Nykr!*3%-9#vsZVNsYizPGDglo_2Y zfWmz2e4;R21%+LnjiO(IfWkryLi{k{m79`cn6`3HX9fxj2#LWA0rC`u)RB1FLWVFN zjArCQcUMj#$k^hd+MDtHR>PX)`A)hHoHt%rT@?sa{iIj4m$Sq0s^8?>e5ud*uDld}{xH?< z^Z}LmjM-QCLYlM6Z)G(5uldqAySi(On)A!eIUd<1Oh350<{K^)O;AtX_iDkcP4oR8 z1ZciComJF+P*Fdx^4*t5SygivZmnfwG_9#@-`Vw%= zTjrL0t$Wq4i5d!~N+V}Ej~*X4amw`V1Be2t%MadXkn-yO*e(y!VpGZ|vt_NP2N zYJN6{QIwI37GWz$jQ%L8XjEbX3zji^YQaZfC-p1Ls4p4@o6A$9?SZ}UThLvEIev_9DIB* zZ9Hls0wQ8?JJduJMbwda+9HN9Ug7h^J%JM?Bp7+r_&NCbV6HAG?DA|B{SpKe7GV(K zhuI60X5_-^8K5x8Cot7TpUQIm`(GRZ8Y0RmDg?6<=18DwkjG%Efqu$K1aXRsl8b?X z!oa9jct|n%@sb5WOsXmjDsXiSst9IsZc2_ekgK4n#Lq0v!YU`p!OO$N$u1})A}TH+ ZCd|Sr3l!kyWakr*XJV7mlwnk4001y#8{+@~ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/umodsi3.c.7A9476DD12568553.idx b/.cache/clangd/index/umodsi3.c.7A9476DD12568553.idx new file mode 100755 index 0000000000000000000000000000000000000000..bee580688143df571ffbd900db7d4e15954d57db GIT binary patch literal 822 zcmWIYbaT^VW?*nm@vO*AElFfyU|+MDtHR>PX)`A)hHoHt%rT@?sa{iIj4m$Sq0s^8?>e5ud*uDld}{xH?< z^Z}LmjM-QCLYlM6Z)G(5uldqAySi(On)A!eIUd<1Oh350<{K^)O;AtX_iDkcP4oR8 z1ZciComJF+P*Fdx^4*t5SygivZmnfwG_9#@-`Vw%Xi;^v~CzdMo{q+hjHW-`RO?N51l z)ck!LXDUN+Wo}X|Fb;g;GFD`q40GXOP-b9I6A>3t024qNFbG@ydgq$!oC(|v>Og6J zetvN<0h4x}`$%@4uwe@~g9cEVkDpHhOu(cWic-^xPXl={TNt@eOfM+x@@y3S62!=( zCc+@X57P#-6sQ_xBTN`(8BiEx6HJ)-QC9ZZ>Vy3(JZgL#e0(rfKqCc2#9$T!d5R+H zNIY#3Lm02Gsr07DNBu>b%7 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/umodti3.c.DB9DB5C81AF2F756.idx b/.cache/clangd/index/umodti3.c.DB9DB5C81AF2F756.idx new file mode 100755 index 0000000000000000000000000000000000000000..d9f1cbfbb566991b681240ea80bea84e04a94170 GIT binary patch literal 682 zcmWIYbaPw8#K7R3;#rZKT9U}Zz`!63#Kk2=nF)*x3_F2x6?5iJ$oFS5`ewMtmA zL+$&a1!^i>M-pl(Ew>eg-<*GXoAQI@+YOZW98HOwx2<~DKP?6p8{g$ue;=xOqTTNMkx%$GfA3EpS6%@Hoyq2ONdurMiH}!`73o1G|*D_ekeGFy4I_>vK z3BQS(;udRemyr4NVA^lLytc`^b=KZZ7YsPOy?n-EiStb}=k|AIN=$QqyW(-uffv6Q z2$-}6eKYiM&dxk@?$p7(F_R~|7TO)3WwbSWhsF%==~)IR78Tlh*G<0u%tRxjw8LrJ zy+u5w*Q0jw{NoOuGO=fxq^lO|!tzcXro&-8)mxpv?V00p*r`+4>73K@0~20gB^btt*X;aa%PiXvgeP>c0N&o4+BGTZc2_ekgK4n t#Lq0v!YU`p!OO$N$u1})A}TH+Cd|Sr3l!kyWakr*XJV65lVMb3001$X>3aYG literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/vmm.h.3958D0C383864F44.idx b/.cache/clangd/index/vmm.h.3958D0C383864F44.idx new file mode 100755 index 0000000000000000000000000000000000000000..f1f0ddfe9df562c9aefb2d4de98434edb0e732ee GIT binary patch literal 1938 zcmYk63rtg27{|Xt+uPp9X=$M?tdv#?1u+N-4qaTBLlH1U9-9-F7!<)dUX!8&+`!?S ziVBI2nHe9M8XS=^rz6DSBZ3-*jZJ4}@U?*(nFO$JxNb`|NY(bo%5al zzquJ{X^k8}>Y9w|vZAV0N&qm@kGraJU8n-!Pyj&nftKuhnY{_Y14o}8F_)LBH&kCg z@zHGi1VkkrFG;FDbiholuJ|V6QdW*_ z{KU%q+PjO^>2rruW-NX@H0$5|y9X~X+nH)9x#G@wvcICSfAqqnF!puz=$X}7o$=3S zPqp=>A0D2Q5SxCppy;bVw45P5vZUpcM)&=Bf!3|#Vtv|kKDau2#gpXMg#BF_{nfs* z(|>DhEO&ozJP?(#F&FBK<$5SI36 z!Qj&Bjn`_Vz;{gB+P41E(RME5*u$WUxvhOOGk^Ow^|Manse!m%uh#`7ZHIXsUDw{r zJXP^u*64b0*OaZ^L%UNEbar{(Uj-mSIPIHf5U0v1fmW%6NM1oyioA=p`JHDoMR0h3 z2NI=fb^LQogc%6LsA33c)dAi^K5MVD-`KIK zT>={dc7r{_cZ#dQYZYr6QooaEC%uDM1dCsZ**C#a*j3*rK_~(S!QclxJls(AY4%9J z1i=XC1f3tS_~WJvKb)TXlL!$AM604hd^d4^QU3k7t}C}hcnN_>A=1q5lC?U`IJ~3x z?ZMj;3yFszdO`2ksGNOymc1&&m;@$VAw&oX^EE1AuYdirr0tK4&VlUPsDw ze%_beh40>0D0sqacp|GXw`0k&&9&nKm9-izb`Y#DcExwA_u8l|XaqgdCzB?RmrOVk zsjSkdrs@7?=8m3*$puu_Xf&Qb5;iabbSKREvW&*3w8!=6V>CRanbBn$f2Op@Kp)$*iEMsD*%#tF@ zm=h|qe8@7UgUT!wvW%IaGRuN2V-l#$5+KXye=0NI%QCv2%FOMuj9#ZQ^SCUd!>PAC z_Lfx;iJi0S@lYaha1K4*v`8W$Qj66^5)~X3j-C-ov?)3QH%wbExlDfT)x}t_y_g&= z?@f$cStL46$73TzqUZEHo=7AH&cI{uL}KKOJbFPSAzTQLhZKp4Gx2zXBC&859/dev/null;; \ + riscv64) dd if=/dev/zero of=$@ bs=1 count=0 seek=33554432 2>/dev/null;; \ + esac + +limine/limine: + rm -rf limine + git clone https://github.com/limine-bootloader/limine.git --branch=v9.x-binary --depth=1 + $(MAKE) -C limine \ + CC="$(HOST_CC)" \ + CFLAGS="$(HOST_CFLAGS)" \ + CPPFLAGS="$(HOST_CPPFLAGS)" \ + LDFLAGS="$(HOST_LDFLAGS)" \ + LIBS="$(HOST_LIBS)" + +kernel-deps: + ./kernel/get-deps + touch kernel-deps + +.PHONY: kernel +kernel: kernel-deps + $(MAKE) -C kernel + +$(IMAGE_NAME).iso: limine/limine kernel + rm -rf iso_root + mkdir -p iso_root/boot + cp -v kernel/bin-$(ARCH)/kernel iso_root/boot/ + mkdir -p iso_root/boot/limine + cp -v limine.conf iso_root/boot/limine/ + mkdir -p iso_root/EFI/BOOT +ifeq ($(ARCH),x86_64) + cp -v limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/boot/limine/ + cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/ + cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/ + xorriso -as mkisofs -R -r -J -b boot/limine/limine-bios-cd.bin \ + -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ + -apm-block-size 2048 --efi-boot boot/limine/limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + iso_root -o $(IMAGE_NAME).iso + ./limine/limine bios-install $(IMAGE_NAME).iso +endif +ifeq ($(ARCH),aarch64) + cp -v limine/limine-uefi-cd.bin iso_root/boot/limine/ + cp -v limine/BOOTAA64.EFI iso_root/EFI/BOOT/ + xorriso -as mkisofs -R -r -J \ + -hfsplus -apm-block-size 2048 \ + --efi-boot boot/limine/limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + iso_root -o $(IMAGE_NAME).iso +endif +ifeq ($(ARCH),riscv64) + cp -v limine/limine-uefi-cd.bin iso_root/boot/limine/ + cp -v limine/BOOTRISCV64.EFI iso_root/EFI/BOOT/ + xorriso -as mkisofs -R -r -J \ + -hfsplus -apm-block-size 2048 \ + --efi-boot boot/limine/limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + iso_root -o $(IMAGE_NAME).iso +endif +ifeq ($(ARCH),loongarch64) + cp -v limine/limine-uefi-cd.bin iso_root/boot/limine/ + cp -v limine/BOOTLOONGARCH64.EFI iso_root/EFI/BOOT/ + xorriso -as mkisofs -R -r -J \ + -hfsplus -apm-block-size 2048 \ + --efi-boot boot/limine/limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + iso_root -o $(IMAGE_NAME).iso +endif + rm -rf iso_root + +$(IMAGE_NAME).hdd: limine/limine kernel + rm -f $(IMAGE_NAME).hdd + dd if=/dev/zero bs=1M count=0 seek=64 of=$(IMAGE_NAME).hdd + PATH=$$PATH:/usr/sbin:/sbin sgdisk $(IMAGE_NAME).hdd -n 1:2048 -t 1:ef00 +ifeq ($(ARCH),x86_64) + ./limine/limine bios-install $(IMAGE_NAME).hdd +endif + mformat -i $(IMAGE_NAME).hdd@@1M + mmd -i $(IMAGE_NAME).hdd@@1M ::/EFI ::/EFI/BOOT ::/boot ::/boot/limine + mcopy -i $(IMAGE_NAME).hdd@@1M kernel/bin-$(ARCH)/kernel ::/boot + mcopy -i $(IMAGE_NAME).hdd@@1M limine.conf ::/boot/limine +ifeq ($(ARCH),x86_64) + mcopy -i $(IMAGE_NAME).hdd@@1M limine/limine-bios.sys ::/boot/limine + mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTX64.EFI ::/EFI/BOOT + mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTIA32.EFI ::/EFI/BOOT +endif +ifeq ($(ARCH),aarch64) + mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTAA64.EFI ::/EFI/BOOT +endif +ifeq ($(ARCH),riscv64) + mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTRISCV64.EFI ::/EFI/BOOT +endif +ifeq ($(ARCH),loongarch64) + mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTLOONGARCH64.EFI ::/EFI/BOOT +endif + +.PHONY: clean +clean: + $(MAKE) -C kernel clean + rm -rf iso_root $(IMAGE_NAME).iso $(IMAGE_NAME).hdd + +.PHONY: distclean +distclean: + $(MAKE) -C kernel distclean + rm -rf iso_root *.iso *.hdd kernel-deps limine ovmf diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..295294b --- /dev/null +++ b/LICENSE @@ -0,0 +1,12 @@ +Copyright (C) 2023-2025 mintsuki and contributors. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/README.md b/README.md new file mode 100755 index 0000000..795a5f5 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# SILD (SILD isn't a Linux distro) \ No newline at end of file diff --git a/_.git/HEAD b/_.git/HEAD new file mode 100755 index 0000000..8a752b6 --- /dev/null +++ b/_.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/trunk diff --git a/_.git/config b/_.git/config new file mode 100755 index 0000000..438fd28 --- /dev/null +++ b/_.git/config @@ -0,0 +1,12 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://github.com/limine-bootloader/limine-c-template + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "trunk"] + remote = origin + merge = refs/heads/trunk + vscode-merge-base = origin/trunk diff --git a/_.git/description b/_.git/description new file mode 100755 index 0000000..498b267 --- /dev/null +++ b/_.git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/_.git/hooks/applypatch-msg.sample b/_.git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/_.git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/_.git/hooks/commit-msg.sample b/_.git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/_.git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/_.git/hooks/fsmonitor-watchman.sample b/_.git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/_.git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/_.git/hooks/post-update.sample b/_.git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/_.git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/_.git/hooks/pre-applypatch.sample b/_.git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/_.git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/_.git/hooks/pre-commit.sample b/_.git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/_.git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff-index --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/_.git/hooks/pre-merge-commit.sample b/_.git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/_.git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/_.git/hooks/pre-push.sample b/_.git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/_.git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/_.git/hooks/pre-rebase.sample b/_.git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/_.git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/_.git/hooks/pre-receive.sample b/_.git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/_.git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/_.git/hooks/prepare-commit-msg.sample b/_.git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/_.git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/_.git/hooks/push-to-checkout.sample b/_.git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/_.git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/_.git/hooks/update.sample b/_.git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/_.git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/_.git/index b/_.git/index new file mode 100644 index 0000000000000000000000000000000000000000..91602cf859f2596cc25a17ca07f606b0764924a8 GIT binary patch literal 1197 zcmZ?q402{*U|<4b-t_$oYZROfUcqPv1`cKm?T3sE42??|7?@u`FoXKDY4w-VA4NT~ zw~%s)nbCad(DMQo1}?qy%#zIXy!@h6pjlu5GY3XP&ErHhPx|Hb!0GWJ#Z@mWjqXG@ zEG;^r?mSoyuS<+{85&#L$S_kZs8wEd@kQuhplV0LOzUTTg$Qn10? z1EWFi0-ARd)jaX%y+2M2 zlY%{7facyoGq-;Ig^Jgm#~*dBey33UdP)Atr8%cRFvy^qo0FfPmyTpMC_#e5wT$-w zjE08qT{QDI2ASF%@&CC%^ViG%oo8bTxJy1u>!Q26D6=@Z4B6e7=H5dyw_?XbkLbD0 zd|CBk!BKm*t!vs 1740611964 +0100 clone: from https://github.com/limine-bootloader/limine-c-template diff --git a/_.git/logs/refs/heads/trunk b/_.git/logs/refs/heads/trunk new file mode 100755 index 0000000..a34e057 --- /dev/null +++ b/_.git/logs/refs/heads/trunk @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 976ef51b0ff31f7e1f8f38994e23723496b6745f raphm 1740611964 +0100 clone: from https://github.com/limine-bootloader/limine-c-template diff --git a/_.git/logs/refs/remotes/origin/HEAD b/_.git/logs/refs/remotes/origin/HEAD new file mode 100755 index 0000000..a34e057 --- /dev/null +++ b/_.git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 976ef51b0ff31f7e1f8f38994e23723496b6745f raphm 1740611964 +0100 clone: from https://github.com/limine-bootloader/limine-c-template diff --git a/_.git/objects/pack/pack-2706704623c6f502f1188ffe246bc5ef0196c18f.idx b/_.git/objects/pack/pack-2706704623c6f502f1188ffe246bc5ef0196c18f.idx new file mode 100755 index 0000000000000000000000000000000000000000..7fb5be039e33d4e6034fa2c9c31fbe569176c465 GIT binary patch literal 20840 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 literal 0 HcmV?d00001 diff --git a/_.git/packed-refs b/_.git/packed-refs new file mode 100755 index 0000000..6126578 --- /dev/null +++ b/_.git/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +976ef51b0ff31f7e1f8f38994e23723496b6745f refs/remotes/origin/trunk diff --git a/_.git/refs/heads/trunk b/_.git/refs/heads/trunk new file mode 100755 index 0000000..e95fa4d --- /dev/null +++ b/_.git/refs/heads/trunk @@ -0,0 +1 @@ +976ef51b0ff31f7e1f8f38994e23723496b6745f diff --git a/_.git/refs/remotes/origin/HEAD b/_.git/refs/remotes/origin/HEAD new file mode 100755 index 0000000..ac41ed5 --- /dev/null +++ b/_.git/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +ref: refs/remotes/origin/trunk diff --git a/compile_commands.json b/compile_commands.json new file mode 100755 index 0000000..f556a44 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,40 @@ +[ + { + "arguments": [ + "/usr/bin/cc", + "-g", + "-O2", + "-pipe", + "-Wall", + "-Wextra", + "-std=gnu11", + "-nostdinc", + "-ffreestanding", + "-fno-stack-protector", + "-fno-stack-check", + "-fno-PIC", + "-ffunction-sections", + "-fdata-sections", + "-m64", + "-march=x86-64", + "-mno-80387", + "-mno-mmx", + "-mno-sse", + "-mno-sse2", + "-mno-red-zone", + "-mcmodel=kernel", + "-I", + "src", + "-isystem", + "freestnd-c-hdrs", + "-DLIMINE_API_REVISION=3", + "-c", + "-o", + "obj-x86_64/main.c.o", + "src/main.c" + ], + "directory": "/home/raphm/Projets/sild/kernel", + "file": "/home/raphm/Projets/sild/kernel/src/main.c", + "output": "/home/raphm/Projets/sild/kernel/obj-x86_64/main.c.o" + } +] diff --git a/ints b/ints new file mode 100644 index 0000000..e69de29 diff --git a/kernel/.gitignore b/kernel/.gitignore new file mode 100755 index 0000000..4eeb3d0 --- /dev/null +++ b/kernel/.gitignore @@ -0,0 +1,5 @@ +/freestnd-c-hdrs +/cc-runtime* +/src/limine.h +/bin-* +/obj-* diff --git a/kernel/GNUmakefile b/kernel/GNUmakefile new file mode 100755 index 0000000..8df9eac --- /dev/null +++ b/kernel/GNUmakefile @@ -0,0 +1,220 @@ +# Nuke built-in rules and variables. +MAKEFLAGS += -rR +.SUFFIXES: + +# This is the name that our final executable will have. +# Change as needed. +override OUTPUT := kernel + +# Target architecture to build for. Default to x86_64. +ARCH := x86_64 + +# Install prefix; /usr/local is a good, standard default pick. +PREFIX := /usr/local + +# Check if the architecture is supported. +ifeq ($(filter $(ARCH),aarch64 loongarch64 riscv64 x86_64),) + $(error Architecture $(ARCH) not supported) +endif + +# User controllable C compiler command. +CC := cc + +# User controllable archiver command. +AR := ar + +# User controllable C flags. +CFLAGS := -g -O2 -pipe + +# User controllable C preprocessor flags. We set none by default. +CPPFLAGS := + +ifeq ($(ARCH),x86_64) + # User controllable nasm flags. + NASMFLAGS := -F dwarf -g +endif + +# User controllable linker flags. We set none by default. +LDFLAGS := + +# Ensure the dependencies have been obtained. +ifneq ($(shell ( test '$(MAKECMDGOALS)' = clean || test '$(MAKECMDGOALS)' = distclean ); echo $$?),0) + ifeq ($(shell ( ! test -d freestnd-c-hdrs || ! test -d cc-runtime || ! test -f src/limine.h ); echo $$?),0) + $(error Please run the ./get-deps script first) + endif +endif + +# Check if CC is Clang. +override CC_IS_CLANG := $(shell ! $(CC) --version 2>/dev/null | grep 'clang' >/dev/null 2>&1; echo $$?) + +# Internal C flags that should not be changed by the user. +override CFLAGS += \ + -Wall \ + -Wextra \ + -std=gnu11 \ + -nostdinc \ + -ffreestanding \ + -fno-stack-protector \ + -fno-stack-check \ + -fno-PIC \ + -ffunction-sections \ + -fdata-sections + +# Internal C preprocessor flags that should not be changed by the user. +override CPPFLAGS := \ + -I src \ + -isystem freestnd-c-hdrs \ + $(CPPFLAGS) \ + -DLIMINE_API_REVISION=3 \ + -MMD \ + -MP + +ifeq ($(ARCH),x86_64) + # Internal nasm flags that should not be changed by the user. + override NASMFLAGS += \ + -Wall +endif + +# Architecture specific internal flags. +ifeq ($(ARCH),x86_64) + ifeq ($(CC_IS_CLANG),1) + override CC += \ + -target x86_64-unknown-none + endif + override CFLAGS += \ + -m64 \ + -march=x86-64 \ + -mno-80387 \ + -mno-mmx \ + -mno-sse \ + -mno-sse2 \ + -mno-red-zone \ + -mcmodel=kernel + override LDFLAGS += \ + -Wl,-m,elf_x86_64 + override NASMFLAGS += \ + -f elf64 +endif +ifeq ($(ARCH),aarch64) + ifeq ($(CC_IS_CLANG),1) + override CC += \ + -target aarch64-unknown-none + endif + override CFLAGS += \ + -mgeneral-regs-only + override LDFLAGS += \ + -Wl,-m,aarch64elf +endif +ifeq ($(ARCH),riscv64) + ifeq ($(CC_IS_CLANG),1) + override CC += \ + -target riscv64-unknown-none + override CFLAGS += \ + -march=rv64imac + else + override CFLAGS += \ + -march=rv64imac_zicsr_zifencei + endif + override CFLAGS += \ + -mabi=lp64 \ + -mno-relax + override LDFLAGS += \ + -Wl,-m,elf64lriscv \ + -Wl,--no-relax +endif +ifeq ($(ARCH),loongarch64) + ifeq ($(CC_IS_CLANG),1) + override CC += \ + -target loongarch64-unknown-none + endif + override CFLAGS += \ + -march=loongarch64 \ + -mabi=lp64s + override LDFLAGS += \ + -Wl,-m,elf64loongarch \ + -Wl,--no-relax +endif + +# Internal linker flags that should not be changed by the user. +override LDFLAGS += \ + -Wl,--build-id=none \ + -nostdlib \ + -static \ + -z max-page-size=0x1000 \ + -Wl,--gc-sections \ + -T linker-$(ARCH).ld + +# Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the +# object and header dependency file names. +override SRCFILES := $(shell cd src && find -L * -type f | LC_ALL=C sort) +override CFILES := $(filter %.c,$(SRCFILES)) +override ASFILES := $(filter %.S,$(SRCFILES)) +ifeq ($(ARCH),x86_64) +override NASMFILES := $(filter %.asm,$(SRCFILES)) +endif +override OBJ := $(addprefix obj-$(ARCH)/,$(CFILES:.c=.c.o) $(ASFILES:.S=.S.o)) +ifeq ($(ARCH),x86_64) +override OBJ += $(addprefix obj-$(ARCH)/,$(NASMFILES:.asm=.asm.o)) +endif +override HEADER_DEPS := $(addprefix obj-$(ARCH)/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d)) + +# Default target. This must come first, before header dependencies. +.PHONY: all +all: bin-$(ARCH)/$(OUTPUT) + +# Include header dependencies. +-include $(HEADER_DEPS) + +# Link rules for building the C compiler runtime. +cc-runtime-$(ARCH)/cc-runtime.a: GNUmakefile cc-runtime/* + rm -rf cc-runtime-$(ARCH) + cp -r cc-runtime cc-runtime-$(ARCH) + $(MAKE) -C cc-runtime-$(ARCH) -f cc-runtime.mk \ + CC="$(CC)" \ + AR="$(AR)" \ + CFLAGS="$(CFLAGS)" \ + CPPFLAGS='-isystem ../freestnd-c-hdrs -DCC_RUNTIME_NO_FLOAT' + +# Link rules for the final executable. +bin-$(ARCH)/$(OUTPUT): GNUmakefile linker-$(ARCH).ld $(OBJ) cc-runtime-$(ARCH)/cc-runtime.a + mkdir -p "$$(dirname $@)" + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) cc-runtime-$(ARCH)/cc-runtime.a -o $@ + +# Compilation rules for *.c files. +obj-$(ARCH)/%.c.o: src/%.c GNUmakefile + mkdir -p "$$(dirname $@)" + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +# Compilation rules for *.S files. +obj-$(ARCH)/%.S.o: src/%.S GNUmakefile + mkdir -p "$$(dirname $@)" + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +ifeq ($(ARCH),x86_64) +# Compilation rules for *.asm (nasm) files. +obj-$(ARCH)/%.asm.o: src/%.asm GNUmakefile + mkdir -p "$$(dirname $@)" + nasm $(NASMFLAGS) $< -o $@ +endif + +# Remove object files and the final executable. +.PHONY: clean +clean: + rm -rf bin-$(ARCH) obj-$(ARCH) cc-runtime-$(ARCH) + +# Remove everything built and generated including downloaded dependencies. +.PHONY: distclean +distclean: + rm -rf bin-* obj-* freestnd-c-hdrs cc-runtime* src/limine.h + +# Install the final built executable to its final on-root location. +.PHONY: install +install: all + install -d "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)" + install -m 644 bin-$(ARCH)/$(OUTPUT) "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)/$(OUTPUT)-$(ARCH)" + +# Try to undo whatever the "install" target did. +.PHONY: uninstall +uninstall: + rm -f "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)/$(OUTPUT)-$(ARCH)" + -rmdir "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)" diff --git a/kernel/get-deps b/kernel/get-deps new file mode 100755 index 0000000..97cf290 --- /dev/null +++ b/kernel/get-deps @@ -0,0 +1,80 @@ +#! /bin/sh + +set -ex + +srcdir="$(dirname "$0")" +test -z "$srcdir" && srcdir=. + +cd "$srcdir" + +clone_repo_commit() { + if test -d "$2/.git"; then + git -C "$2" reset --hard + git -C "$2" clean -fd + if ! git -C "$2" checkout $3; then + rm -rf "$2" + fi + else + if test -d "$2"; then + set +x + echo "error: '$2' is not a Git repository" + exit 1 + fi + fi + if ! test -d "$2"; then + git clone $1 "$2" + if ! git -C "$2" checkout $3; then + rm -rf "$2" + exit 1 + fi + fi +} + +download_by_hash() { + DOWNLOAD_COMMAND="curl -Lo" + if ! command -v $DOWNLOAD_COMMAND >/dev/null 2>&1; then + DOWNLOAD_COMMAND="wget -O" + if ! command -v $DOWNLOAD_COMMAND >/dev/null 2>&1; then + set +x + echo "error: Neither curl nor wget found" + exit 1 + fi + fi + SHA256_COMMAND="sha256sum" + if ! command -v $SHA256_COMMAND >/dev/null 2>&1; then + SHA256_COMMAND="sha256" + if ! command -v $SHA256_COMMAND >/dev/null 2>&1; then + set +x + echo "error: Cannot find sha256(sum) command" + exit 1 + fi + fi + if ! test -f "$2" || ! $SHA256_COMMAND "$2" | grep $3 >/dev/null 2>&1; then + rm -f "$2" + mkdir -p "$2" && rm -rf "$2" + $DOWNLOAD_COMMAND "$2" $1 + if ! $SHA256_COMMAND "$2" | grep $3 >/dev/null 2>&1; then + set +x + echo "error: Cannot download file '$2' by hash" + echo "incorrect hash:" + $SHA256_COMMAND "$2" + rm -f "$2" + exit 1 + fi + fi +} + +clone_repo_commit \ + https://github.com/osdev0/freestnd-c-hdrs-0bsd.git \ + freestnd-c-hdrs \ + a87c192f3eb66b0806740dc67325f9ad23fc2d0b + +clone_repo_commit \ + https://github.com/osdev0/cc-runtime.git \ + cc-runtime \ + 576a01179f3298a4795b92f42c088f9f8800b56b + +download_by_hash \ + https://github.com/limine-bootloader/limine/raw/4687a182be23939c2d9f15db970382dc353ed956/limine.h \ + src/limine.h \ + 6879e626f34c1be25ac2f72bf43b083fc2b53887280bb0fcdaee790e258c6974 diff --git a/kernel/linker-aarch64.ld b/kernel/linker-aarch64.ld new file mode 100755 index 0000000..e6dd67a --- /dev/null +++ b/kernel/linker-aarch64.ld @@ -0,0 +1,68 @@ +/* Tell the linker that we want an aarch64 ELF64 output file */ +OUTPUT_FORMAT(elf64-littleaarch64) + +/* We want the symbol kmain to be our entry point */ +ENTRY(kmain) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions; this also allows us to exert more control over the linking */ +/* process. */ +PHDRS +{ + limine_requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + /* We want to be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + /* Define a section to contain the Limine requests and assign it to its own PHDR */ + .limine_requests : { + KEEP(*(.limine_requests_start)) + KEEP(*(.limine_requests)) + KEEP(*(.limine_requests_end)) + } :limine_requests + + /* Move to the next memory page for .text */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .text : { + *(.text .text.*) + } :text + + /* Move to the next memory page for .rodata */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Move to the next memory page for .data */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + *(.data .data.*) + } :data + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.bss .bss.*) + *(COMMON) + } :data + + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} diff --git a/kernel/linker-loongarch64.ld b/kernel/linker-loongarch64.ld new file mode 100755 index 0000000..afd078e --- /dev/null +++ b/kernel/linker-loongarch64.ld @@ -0,0 +1,68 @@ +/* Tell the linker that we want a loongarch64 ELF64 output file */ +OUTPUT_FORMAT(elf64-loongarch) + +/* We want the symbol kmain to be our entry point */ +ENTRY(kmain) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions; this also allows us to exert more control over the linking */ +/* process. */ +PHDRS +{ + limine_requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + /* We want to be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + /* Define a section to contain the Limine requests and assign it to its own PHDR */ + .limine_requests : { + KEEP(*(.limine_requests_start)) + KEEP(*(.limine_requests)) + KEEP(*(.limine_requests_end)) + } :limine_requests + + /* Move to the next memory page for .text */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .text : { + *(.text .text.*) + } :text + + /* Move to the next memory page for .rodata */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Move to the next memory page for .data */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + *(.data .data.*) + } :data + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.bss .bss.*) + *(COMMON) + } :data + + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} diff --git a/kernel/linker-riscv64.ld b/kernel/linker-riscv64.ld new file mode 100755 index 0000000..52353cc --- /dev/null +++ b/kernel/linker-riscv64.ld @@ -0,0 +1,70 @@ +/* Tell the linker that we want a riscv64 ELF64 output file */ +OUTPUT_FORMAT(elf64-littleriscv) + +/* We want the symbol kmain to be our entry point */ +ENTRY(kmain) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions; this also allows us to exert more control over the linking */ +/* process. */ +PHDRS +{ + limine_requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + /* We want to be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + /* Define a section to contain the Limine requests and assign it to its own PHDR */ + .limine_requests : { + KEEP(*(.limine_requests_start)) + KEEP(*(.limine_requests)) + KEEP(*(.limine_requests_end)) + } :limine_requests + + /* Move to the next memory page for .text */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .text : { + *(.text .text.*) + } :text + + /* Move to the next memory page for .rodata */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Move to the next memory page for .data */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + *(.data .data.*) + *(.sdata .sdata.*) + } :data + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.sbss .sbss.*) + *(.bss .bss.*) + *(COMMON) + } :data + + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} diff --git a/kernel/linker-x86_64.ld b/kernel/linker-x86_64.ld new file mode 100755 index 0000000..8fe5465 --- /dev/null +++ b/kernel/linker-x86_64.ld @@ -0,0 +1,77 @@ +/* Tell the linker that we want an x86_64 ELF64 output file */ +OUTPUT_FORMAT(elf64-x86-64) + +/* We want the symbol kmain to be our entry point */ +ENTRY(kmain) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions; this also allows us to exert more control over the linking */ +/* process. */ +PHDRS +{ + limine_requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + /* We want to be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + + .text : { + text_start_ld = .; + *(.text .text.*) + text_end_ld = .; + } :text + + /* Move to the next memory page for .limine_requests */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + /* Define a section to contain the Limine requests and assign it to its own PHDR */ + .limine_requests : { + reqs_start_ld = .; + KEEP(*(.limine_requests_start)) + KEEP(*(.limine_requests)) + KEEP(*(.limine_requests_end)) + reqs_end_ld = .; + } :limine_requests + + /* Move to the next memory page for .rodata */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + rodata_start_ld = .; + *(.rodata .rodata.*) + rodata_end_ld = .; + } :rodata + + /* Move to the next memory page for .data */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + data_start_ld = .; + *(.data .data.*) + } :data + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.bss .bss.*) + *(COMMON) + data_end_ld = .; + } :data + + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} diff --git a/kernel/src/font.h b/kernel/src/font.h new file mode 100755 index 0000000..bdfa5b8 --- /dev/null +++ b/kernel/src/font.h @@ -0,0 +1,261 @@ +#pragma once + +// array size is 4096 +unsigned char VGA8[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, + 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, + 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; \ No newline at end of file diff --git a/kernel/src/main.c b/kernel/src/main.c new file mode 100755 index 0000000..b5b6fa0 --- /dev/null +++ b/kernel/src/main.c @@ -0,0 +1,124 @@ +#include "mm/pmm.h" +#include "mm/vmm.h" +#include "rt.h" +#include "sched/sched.h" +#include "sys/arch/x86_64/cpuid.h" +#include "sys/arch/x86_64/io.h" +#include "sys/arch/x86_64/pit.h" +#include "sys/arch/x86_64/rtc.h" +#include "sys/arch/x86_64/sse.h" +#include +#include +#include +#include +#include + +#include +#include +#include + +// Set the base revision to 3, this is recommended as this is the latest +// base revision described by the Limine boot protocol specification. +// See specification for further info. + +__attribute__((used, section(".limine_requests"))) +static volatile LIMINE_BASE_REVISION(3); + +// The Limine requests can be placed anywhere, but it is important that +// the compiler does not optimise them away, so, usually, they should +// be made volatile or equivalent, _and_ they should be accessed at least +// once or marked as used with the "used" attribute as done here. + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_framebuffer_request framebuffer_request = { + .id = LIMINE_FRAMEBUFFER_REQUEST, + .revision = 0 +}; + +/*__attribute__((used, section(".limine_requests"))) +static volatile struct limine_entry_point_request entrypoint_request = { + .id = LIMINE_ENTRY_POINT_REQUEST, + .revision = 3 +};*/ +// Finally, define the start and end markers for the Limine requests. +// These can also be moved anywhere, to any .c file, as seen fit. + +__attribute__((used, section(".limine_requests_start"))) +static volatile LIMINE_REQUESTS_START_MARKER; + +__attribute__((used, section(".limine_requests_end"))) +static volatile LIMINE_REQUESTS_END_MARKER; + + +// Halt and catch fire function. +static void hcf(void) { + for (;;) { +#if defined (__x86_64__) + asm ("hlt"); +#elif defined (__aarch64__) || defined (__riscv) + asm ("wfi"); +#elif defined (__loongarch64) + asm ("idle 0"); +#endif + } +} + +int init() { + asm("int $0x80"); + while (1) + ;; +} + +struct limine_framebuffer *fb; + +// The following will be our kernel's entry point. +// If renaming kmain() to something else, make sure to change the +// linker script accordingly. +void kmain(void) { + // Ensure the bootloader actually understands our base revision (see spec). + if (LIMINE_BASE_REVISION_SUPPORTED == false) { + hcf(); + } + + // Ensure we got a framebuffer. + if (framebuffer_request.response == NULL + || framebuffer_request.response->framebuffer_count < 1) { + hcf(); + } + + // Fetch the first framebuffer. + struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; + fb = framebuffer; + + rt_context ctx; + ctx.framebuffer = fb->address; + ctx.framebuffer_width = fb->width; + ctx.framebuffer_height = fb->height; + rt_init(ctx); + + printf("\n Soaplin 1.0-sild is booting up your computer...\n\n"); + //printf("Physical kernel EP: %p", entrypoint_request.entry); + + gdt_init(); + idt_init(); + + sse_init(); + + pmm_init(); + vmm_init(); + + pit_init(1000); + sched_init(); + + uint64_t *mem = pmm_request_page(); + mem[0] = 0xCD; + mem[1] = 0x80; + mem[2] = 0xFE; + mem[3] = 0xEB; + sched_process *proc = sched_create("Init", 0x1000, SCHED_USER_PROCESS); + vmm_map(proc->pm, 0x1000, (uint64_t)mem, VMM_PRESENT | VMM_USER); + + log("kernel - Soaplin initialized sucessfully.\n"); + while (1) + ;;//__asm__ volatile ("hlt"); +} diff --git a/kernel/src/mm/memop.c b/kernel/src/mm/memop.c new file mode 100755 index 0000000..dca421b --- /dev/null +++ b/kernel/src/mm/memop.c @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. + +#include "mm/pmm.h" +#include +#include + +void *memcpy(void *dest, const void *src, size_t n) { + uint8_t *pdest = (uint8_t *)dest; + const uint8_t *psrc = (const uint8_t *)src; + + + for (size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; + } + + return dest; +} + +void *memset(void *s, int c, size_t n) { + uint8_t *p = (uint8_t *)s; + + for (size_t i = 0; i < n; i++) { + p[i] = (uint8_t)c; + } + + return s; +} + +void *memmove(void *dest, const void *src, size_t n) { + uint8_t *pdest = (uint8_t *)dest; + const uint8_t *psrc = (const uint8_t *)src; + + if (src > dest) { + for (size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; + } + } else if (src < dest) { + for (size_t i = n; i > 0; i--) { + pdest[i - 1] = psrc[i - 1]; + } + } + + return dest; +} + +int memcmp(const void *s1, const void *s2, size_t n) { + const uint8_t *p1 = (const uint8_t *)s1; + const uint8_t *p2 = (const uint8_t *)s2; + + for (size_t i = 0; i < n; i++) { + if (p1[i] != p2[i]) { + return p1[i] < p2[i] ? -1 : 1; + } + } + + return 0; +} \ No newline at end of file diff --git a/kernel/src/mm/memop.h b/kernel/src/mm/memop.h new file mode 100755 index 0000000..7a62f7e --- /dev/null +++ b/kernel/src/mm/memop.h @@ -0,0 +1,13 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. + +#pragma once + +#include +#include + +void *memcpy(void *dest, const void *src, size_t n); +void *memset(void *s, int c, size_t n); +void *memmove(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); \ No newline at end of file diff --git a/kernel/src/mm/pmm.c b/kernel/src/mm/pmm.c new file mode 100755 index 0000000..ebccb22 --- /dev/null +++ b/kernel/src/mm/pmm.c @@ -0,0 +1,114 @@ +#include "limine.h" +#include +#include +#include +#include +#include + +pmm_stack_t stack; +struct limine_memmap_response *_memmap; + +uint64_t hhdm_offset = 0x0; + +__attribute__((used, section(".limine_requests"))) +struct limine_memmap_request mm_req = { + .id = LIMINE_MEMMAP_REQUEST, + .revision = 3 +}; + + +__attribute__((used, section(".limine_requests"))) +struct limine_hhdm_request hhdm_req = { + .id = LIMINE_HHDM_REQUEST, + .revision = 3 +}; + +int pmm_init() +{ + uint64_t free_pages = 0; + hhdm_offset = hhdm_req.response->offset; + + struct limine_memmap_response *memmap = mm_req.response; + _memmap = memmap; + + //DEBUG("mm", "----- PMM //INFO -----"); + int freemem = 0; + for (uint64_t i = 0; i < memmap->entry_count; i++) + { + if (memmap->entries[i]->type == LIMINE_MEMMAP_USABLE) + { + //DEBUG("mm", " - USABLE ENTRY\t\t@ 0x%.16llx, size: 0x%.16llx", memmap->entries[i]->base, memmap->entries[i]->length); + free_pages += DIV_ROUND_UP(memmap->entries[i]->length, PMM_PAGE_SIZE); + freemem += memmap->entries[i]->length; + } + } + + uint64_t array_size = ALIGN_UP(free_pages * 8, PMM_PAGE_SIZE); + + for (uint64_t i = 0; i < memmap->entry_count; i++) + { + struct limine_memmap_entry *entry = memmap->entries[i]; + if (entry->length >= array_size && entry->type == LIMINE_MEMMAP_USABLE) + { + stack.pages = (uintptr_t*)HIGHER_HALF(entry->base); + entry->length -= array_size; + entry->base += array_size; + //DEBUG("mm", " - STACK START\t\t@ 0x%.16llx", stack.pages); + break; + } + } + + for (uint64_t i = 0; i < memmap->entry_count; i++) + { + struct limine_memmap_entry *entry = memmap->entries[i]; + if (entry->type == LIMINE_MEMMAP_USABLE) + { + for (uint64_t j = 0; j < entry->length; j += PMM_PAGE_SIZE) + { + stack.pages[stack.idx++] = entry->base + j; + } + } + } + + stack.max = stack.idx; + //DEBUG("mm", " - MAX INDEX:\t\t%d", stack.max); + //DEBUG("mm", " - CURRENT INDEX:\t%d", stack.idx); + //DEBUG("mm", "--------------------"); + + + log("pmm - %dmb is available to us.\n", freemem / (1024 * 1024)); + return 0; +} + +void *pmm_request_page() +{ + if (stack.idx == 0) + { + //ERROR("mm", "No more pages available."); + log("pmm - out of memory.\n"); + asm("cli"); + while (1) { + asm("hlt"); + } + return NULL; + } + + uint64_t page_addr = stack.pages[--stack.idx]; + memset(HIGHER_HALF(page_addr), 0, PMM_PAGE_SIZE); + return (void *)page_addr; +} + +void pmm_free_page(void *ptr) +{ + if (ptr == NULL) + return; + + if (stack.idx >= stack.max) + { + //ERROR("mm", "Stack overflow attempt while freeing a page."); + log("pmm - could not free the page: stack overflow.\n"); + return; + } + + stack.pages[stack.idx++] = (uint64_t)ptr; +} \ No newline at end of file diff --git a/kernel/src/mm/pmm.h b/kernel/src/mm/pmm.h new file mode 100755 index 0000000..f39a988 --- /dev/null +++ b/kernel/src/mm/pmm.h @@ -0,0 +1,28 @@ +#ifndef PMM_H +#define PMM_H + +#include +#define PMM_PAGE_SIZE 4096 + +typedef struct pmm_stack +{ + uintptr_t *pages; + uint64_t idx; + uint64_t max; +} pmm_stack_t; + +extern uint64_t hhdm_offset; + +#define DIV_ROUND_UP(x, y) (((uint64_t)(x) + ((uint64_t)(y) - 1)) / (uint64_t)(y)) +#define ALIGN_UP(x, y) (DIV_ROUND_UP(x, y) * (uint64_t)(y)) +#define ALIGN_DOWN(x, y) (((uint64_t)(x) / (uint64_t)(y)) * (uint64_t)(y)) + +#define HIGHER_HALF(ptr) ((void *)((uint64_t)ptr) + hhdm_offset) +#define PHYSICAL(ptr) ((void *)((uint64_t)ptr) - hhdm_offset) + +int pmm_init(); +void *pmm_request_page(); +void pmm_free_page(void *ptr); +void pmm_dump(); + +#endif // PMM_H \ No newline at end of file diff --git a/kernel/src/mm/vmm.c b/kernel/src/mm/vmm.c new file mode 100755 index 0000000..6d905e2 --- /dev/null +++ b/kernel/src/mm/vmm.c @@ -0,0 +1,187 @@ +#include "mm/vmm.h" +#include "limine.h" +#include "mm/pmm.h" +#include "mm/memop.h" +#include "sys/log.h" +#include + + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_paging_mode_request pmrq = { + .id = LIMINE_PAGING_MODE_REQUEST, + .revision = 3, + .mode = LIMINE_PAGING_MODE_X86_64_4LVL +}; + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_executable_address_request karq = { + .id = LIMINE_EXECUTABLE_ADDRESS_REQUEST, + .revision = 0, +}; + +pagemap_t *vmm_kernel_pm = NULL; +pagemap_t *vmm_current_pm = NULL; +int vmm_kernel_pm_exists = 0; + +pagemap_t *vmm_alloc_pm() { + pagemap_t *pm = (pagemap_t*)HIGHER_HALF((uint64_t)pmm_request_page()); + memset(pm, 0, PMM_PAGE_SIZE); + + + /*if (vmm_kernel_pm_exists) { + pm->toplevel = (uint64_t*)HIGHER_HALF((uint64_t)pmm_request_page()); + memset(pm->toplevel, 0, PMM_PAGE_SIZE); + + for (int i = 256; i < 512; i++) { + pm->toplevel[i] = vmm_kernel_pm->toplevel[i]; + } + } else { + + __asm__ volatile("mov %%cr3, %0" : "=r"(pm->toplevel) : : "memory"); + pm->toplevel = HIGHER_HALF(pm->toplevel); + logln(info, "vmm", "Limine-provided kernel PML4: %p", pm->toplevel); + + }*/ + + pm->toplevel = (uint64_t*)HIGHER_HALF((uint64_t)pmm_request_page()); + memset(pm->toplevel, 0, PMM_PAGE_SIZE); + + if (vmm_kernel_pm_exists) { + for (int i = 256; i < 512; i++) { + pm->toplevel[i] = vmm_kernel_pm->toplevel[i]; + } + } + + return pm; +} + +void vmm_release_pm(pagemap_t *pm) { + memset(pm->toplevel, 0, PMM_PAGE_SIZE); + memset(pm, 0, PMM_PAGE_SIZE); + pmm_free_page(pm->toplevel); + pmm_free_page(pm); +} + +void vmm_sanity_check() { + uint64_t *my_memory = pmm_request_page(); + *my_memory = 0x40; + + pagemap_t *pm = vmm_alloc_pm(); + vmm_map(pm, 0x1000, (uint64_t)my_memory, VMM_PRESENT | VMM_WRITABLE); + + uint64_t *my_ptr = (uint64_t*)0x1000; + uint64_t ptr_val = 0; + vmm_load_pagemap(pm); + ptr_val = *my_ptr; + vmm_load_pagemap(vmm_kernel_pm); + + if (ptr_val != 0x40) { + log("vmm - sanity check failed. system halted.\n"); + asm("cli"); + while (1) + asm("hlt"); + } +} + +void vmm_init() { + if (pmrq.response->mode != LIMINE_PAGING_MODE_X86_64_4LVL) { + log("vmm - Soaplin only supports 4-level paging!\n"); + asm("cli; hlt;"); + } + vmm_kernel_pm = vmm_alloc_pm(); + vmm_kernel_pm_exists = 1; + + uint64_t kphysaddr = karq.response->physical_base; + uint64_t kvirtaddr = karq.response->virtual_base; + + uint64_t reqs_start = ALIGN_DOWN((uint64_t)reqs_start_ld, PMM_PAGE_SIZE); + uint64_t reqs_end = ALIGN_UP((uint64_t)reqs_end_ld, PMM_PAGE_SIZE); + uint64_t text_start = ALIGN_DOWN((uint64_t)text_start_ld, PMM_PAGE_SIZE); + uint64_t text_end = ALIGN_UP((uint64_t)text_end_ld, PMM_PAGE_SIZE); + uint64_t rodata_start = ALIGN_DOWN((uint64_t)rodata_start_ld, PMM_PAGE_SIZE); + uint64_t rodata_end = ALIGN_UP((uint64_t)rodata_end_ld, PMM_PAGE_SIZE); + uint64_t data_start = ALIGN_DOWN((uint64_t)data_start_ld, PMM_PAGE_SIZE); + uint64_t data_end = ALIGN_UP((uint64_t)data_end_ld, PMM_PAGE_SIZE); + + + log("vmm - mapping .requests section...\n"); + for (uint64_t req = reqs_start; req < reqs_end; req += PMM_PAGE_SIZE) { + vmm_map(vmm_kernel_pm, req, req - kvirtaddr + kphysaddr, VMM_PRESENT | VMM_WRITABLE); + } + + log("vmm - mapping .text section...\n"); + for (uint64_t text = text_start; text < text_end; text += PMM_PAGE_SIZE) { + vmm_map(vmm_kernel_pm, text, text - kvirtaddr + kphysaddr, VMM_PRESENT); + } + + log("vmm - mapping .rodata section...\n"); + for (uint64_t roData = rodata_start; roData < rodata_end; roData += PMM_PAGE_SIZE) + vmm_map(vmm_kernel_pm, roData, roData - kvirtaddr + kphysaddr, + VMM_PRESENT | VMM_NX); + + log("vmm - mapping .data section...\n"); + for (uint64_t data = data_start; data < data_end; data += PMM_PAGE_SIZE) + vmm_map(vmm_kernel_pm, data, data - kvirtaddr + kphysaddr, + VMM_PRESENT | VMM_WRITABLE | VMM_NX); + + log("vmm - mapping address from 0x0 to 0x100000000...\n"); + for (uint64_t gb4 = 0; gb4 < 0x100000000; gb4 += PMM_PAGE_SIZE) { + vmm_map(vmm_kernel_pm, gb4, gb4, VMM_PRESENT | VMM_WRITABLE); + vmm_map(vmm_kernel_pm, (uint64_t)HIGHER_HALF(gb4), gb4, VMM_PRESENT | VMM_WRITABLE); + } + + vmm_load_pagemap(vmm_kernel_pm); + + vmm_sanity_check(); + log("vmm - initialized!\n"); +} + +void vmm_load_pagemap(pagemap_t *pm) { + if (!pm) + return; + + if (!pm->toplevel) + return; + + vmm_current_pm = pm; + __asm__ volatile("mov %0, %%cr3" : : "r"(PHYSICAL(pm->toplevel)) : "memory"); +} + +static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, uint64_t flags) { + if (level[entry] & 1) + return HIGHER_HALF(PTE_GET_ADDR(level[entry])); + uint64_t *pml = HIGHER_HALF(pmm_request_page()); + memset(pml, 0, PMM_PAGE_SIZE); + level[entry] = (uint64_t)PHYSICAL(pml) | (flags & 0xFFF); // N'ajoute que les flags pertinents + return pml; +} + +void vmm_map(pagemap_t *pm, uint64_t vaddr, uint64_t paddr, uint64_t flags) { + uint64_t pml4_entry = (vaddr >> 39) & 0x1ff; + uint64_t pml3_entry = (vaddr >> 30) & 0x1ff; + uint64_t pml2_entry = (vaddr >> 21) & 0x1ff; + uint64_t pml1_entry = (vaddr >> 12) & 0x1ff; + + uint64_t *pml3 = __vmm_get_next_lvl(pm->toplevel, pml4_entry, flags); + uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_entry, flags); + uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_entry, flags); + + pml1[pml1_entry] = paddr | flags; +} +void vmm_unmap(pagemap_t *pm, uint64_t vaddr) { + uint64_t pml1_entry = (vaddr >> 12) & 0x1ff; + uint64_t pml2_entry = (vaddr >> 21) & 0x1ff; + uint64_t pml3_entry = (vaddr >> 30) & 0x1ff; + uint64_t pml4_entry = (vaddr >> 39) & 0x1ff; + + uint64_t *pml3 = __vmm_get_next_lvl(pm->toplevel, pml4_entry, 0); + if (pml3 == NULL) return; + uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_entry, 0); + if (pml2 == NULL) return; + uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_entry, 0); + if (pml1 == NULL) return; + + pml1[pml1_entry] = 0; + + __asm__ volatile ("invlpg (%0)" : : "b"(vaddr) : "memory"); +} \ No newline at end of file diff --git a/kernel/src/mm/vmm.h b/kernel/src/mm/vmm.h new file mode 100755 index 0000000..97239b4 --- /dev/null +++ b/kernel/src/mm/vmm.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#define PTE_ADDR_MASK 0x000ffffffffff000 +#define PTE_GET_ADDR(VALUE) ((VALUE) & PTE_ADDR_MASK) +#define PTE_GET_FLAGS(VALUE) ((VALUE) & ~PTE_ADDR_MASK) + +#define VMM_PRESENT (1 << 0) +#define VMM_WRITABLE (1 << 1) +#define VMM_USER (1 << 2) +#define VMM_NX (1ULL << 63) + +typedef char sym[]; + +extern sym reqs_start_ld; +extern sym reqs_end_ld; + +extern sym text_start_ld; +extern sym text_end_ld; + +extern sym rodata_start_ld; +extern sym rodata_end_ld; + +extern sym data_start_ld; +extern sym data_end_ld; + + +typedef struct pagemap { + uint64_t *toplevel; +} pagemap_t; + +extern pagemap_t *vmm_kernel_pm; +extern pagemap_t *vmm_current_pm; + +pagemap_t *vmm_alloc_pm(); +void vmm_init(); +void vmm_release_pm(pagemap_t *pm); +void vmm_load_pagemap(pagemap_t *pm); +void vmm_map(pagemap_t *pm, uint64_t vaddr, uint64_t paddr, uint64_t flags); +void vmm_unmap(pagemap_t *pm, uint64_t vaddr) ; \ No newline at end of file diff --git a/kernel/src/rt.c b/kernel/src/rt.c new file mode 100755 index 0000000..afec901 --- /dev/null +++ b/kernel/src/rt.c @@ -0,0 +1,85 @@ +#include "rt.h" +#include +#include +#include + +static rt_context _curctx; + +void _rt_drawchar(unsigned char c, int x, int y, int fgcolor, int bgcolor) +{ + int cx,cy; + int mask[8]={128, 64, 32, 16, 8, 4, 2, 1}; + unsigned char *glyph=VGA8+(int)c*16; + + uint32_t *buf = _curctx.framebuffer; + + for(cy=0;cy<16;cy++){ + for(cx=0;cx<8;cx++){ + buf[((y + cy) * _curctx.framebuffer_width) + (x + cx)] = glyph[cy]&mask[cx]?fgcolor:bgcolor; + } + } +} +void _rt_draw_fillchar(int x, int y, int bgcolor, int fgcolor) { + int cx,cy; + uint32_t *buf = _curctx.framebuffer; + for(cy=0;cy<16;cy++){ + for(cx=0;cx<8;cx++){ + buf[((y + cy) * _curctx.framebuffer_width) + (x + cx)] = cy > 12 ? fgcolor : bgcolor; + } + } +} + +int _rt_strlen(char *str) { + int i = 0; + while (str[i] != '\0') i++; + return i; +} + +void rt_init(rt_context ctx) { + // Copy the structure + char *src = (char*)&ctx; + char *dst = (char*)&_curctx; + for (unsigned long i = 0; i < sizeof(rt_context); i++) { + dst[i] = src[i]; + } + + // Fill fields + _curctx.term_width = _curctx.framebuffer_width / 8; + _curctx.term_height = _curctx.framebuffer_height / 16; +} + +void rt_print(char *str) { + _rt_draw_fillchar(_curctx.x * 8, _curctx.y * 16, 0x0, 0x0); + + for (int i = 0; i < _rt_strlen(str); i++) { + if (str[i] == '\n' && _curctx.use_crlf_ending) + if (_curctx.y * 16 >= _curctx.framebuffer_height) { + _curctx.y = 0; + memset( + _curctx.framebuffer, _curctx.bg_color, + _curctx.framebuffer_width * _curctx.framebuffer_height * sizeof(uint32_t)); + } else { + _curctx.y++; + } + else if (str[i] == '\n') + { + if (_curctx.y * 16 >= _curctx.framebuffer_height) { + _curctx.y = 0; + memset( + _curctx.framebuffer, _curctx.bg_color, + _curctx.framebuffer_width * _curctx.framebuffer_height * sizeof(uint32_t)); + } else { + _curctx.y++; + } + _curctx.x = 0; + } + else if (str[i] == '\r') + _curctx.x = 0; + else { + _rt_drawchar(str[i], _curctx.x * 8, _curctx.y * 16, 0xFFFFFF, 0x0); + _curctx.x++; + } + } + + _rt_draw_fillchar(_curctx.x * 8, _curctx.y * 16, 0x0, 0xFFFFFF); +} \ No newline at end of file diff --git a/kernel/src/rt.h b/kernel/src/rt.h new file mode 100755 index 0000000..fcd601c --- /dev/null +++ b/kernel/src/rt.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +typedef struct _rt_ctx { + // A pointer to the framebuffer. + void *framebuffer; + + // The framebuffer width, in pixels. + uint32_t framebuffer_width; + + // The framebuffer height, in pixels. + uint32_t framebuffer_height; + + // Set this to 1 if you prefer using DOS line endings to UNIX line endings. + int use_crlf_ending; + + // Do we need to show a cursor after printing text? + int show_cursor; + + // The background color + uint32_t bg_color; + + // The foreground color + uint32_t fg_color; + + /* + * Do NOT modify everything below me! + */ + // The terminal's width, in columns of 8 pixels. + int term_width; + // The terminal's height, in rows of 16 pixels. + int term_height; + // The X position of the cursor, in columns of 8 pixels. + int x; + // The Y position of the cursor, in rows of 16 pixels. + int y; +} rt_context; + +void rt_init(rt_context ctx); +void rt_print(char *str); \ No newline at end of file diff --git a/kernel/src/sched/sched.c b/kernel/src/sched/sched.c new file mode 100755 index 0000000..b39c2fc --- /dev/null +++ b/kernel/src/sched/sched.c @@ -0,0 +1,111 @@ +#include "sched/sched.h" +#include "mm/pmm.h" +#include "mm/memop.h" +#include "mm/vmm.h" +#include "sys/arch/x86_64/idt.h" +#include "sys/log.h" +#include + +sched_process *proc_list; +sched_process *curr_proc; +int current_pid = 0; +int standby = 0; + +void sched_init() { + // TODO: It may be good to implement heap memory to save space. + + // We must initialize the process list. + // By default, sched_create will append to this list. + proc_list = pmm_request_page(); + memcpy(proc_list->name, "System\0", 7); + proc_list->pid = -1; + proc_list->type = SCHED_EMPTY; + + curr_proc = proc_list; + + standby = 1; + log("sched - As there's nothing " + "to schedule, the scheduler entered standby" + "mode.\n"); +} + +sched_process *sched_create(char *name, uint64_t entry_point, uint32_t flags) +{ + // TODO: implement a separate strlen function + // as there's like 4 strlen impls in the kernel. + int i = 0; + while (name[i] != 0) + i++; + + sched_process *proc = pmm_request_page(); + memset(proc, 0, sizeof(sched_process)); + + memcpy(proc->name, name, i); + proc->pid = current_pid; + proc->type = SCHED_RUNNING; + + // We are about to setup the registers ourself. + // If it's broken, it's a boom in the ass of your computer + // (and a CPU exception) + + proc->pm = vmm_alloc_pm(); + + uint64_t *stack_phys = pmm_request_page(); + uint64_t *stack_virt = (uint64_t*)0x40000000; + + if (flags == SCHED_KERNEL_PROCESS) { + proc->stack_base = stack_phys; + proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE; + } else if (flags == SCHED_USER_PROCESS) { + vmm_map(proc->pm, (uint64_t)stack_virt, (uint64_t)stack_phys, VMM_PRESENT | VMM_WRITABLE | VMM_USER); + proc->stack_base = stack_virt; + proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE; + } + proc->regs.rip = (uint64_t)entry_point; + + if (flags == SCHED_KERNEL_PROCESS) { + proc->regs.cs = 0x28; // Run in kernel mode + proc->regs.ss = 0x30; + } + else if (flags == SCHED_USER_PROCESS) { + proc->regs.cs = 0x43; // Run in kernel mode + proc->regs.ss = 0x3B; + } + proc->regs.rflags = 0x202; // Enable interrupts + proc->regs.rsp = (uint64_t)proc->stack_end; + proc->regs.rbp = 0; + + proc->next = curr_proc->next; + curr_proc->next = proc; + + current_pid++; + + if (standby) { + // Disable standby mode as there's actually something to + // run, now. + standby = 0; + log("sched - Standby mode has been" + "disabled.\n"); + } + return proc; +} + +void schedule(registers_t *regs) +{ + if (standby) { + //log("sched - Sched is in standby.\n"); + return; + } + + memcpy(&curr_proc->regs, regs, sizeof(registers_t)); + + curr_proc = curr_proc->next; + if (curr_proc == NULL) + curr_proc = proc_list; + + //log("sched - I choosed process %d\n", curr_proc->pid); + memcpy(regs, &curr_proc->regs, sizeof(registers_t)); + + // Finally, load our pagemap + //vmm_load_pagemap(curr_proc->pm); +} \ No newline at end of file diff --git a/kernel/src/sched/sched.h b/kernel/src/sched/sched.h new file mode 100755 index 0000000..f5d2b04 --- /dev/null +++ b/kernel/src/sched/sched.h @@ -0,0 +1,39 @@ +#pragma once + +#include "mm/vmm.h" +#include "sys/arch/x86_64/idt.h" + +#define SCHED_KERNEL_PROCESS 0 // A process that runs in kernel mode. +#define SCHED_USER_PROCESS 1 // A process that runs in userspace. The code MUST be mapped directly after creating the process. + +typedef enum { + SCHED_RUNNING, + SCHED_EXITED, + SCHED_EMPTY +} sched_proc_type; + +typedef struct _sched_process { + char name[128]; + int pid; + int type; + + registers_t regs; + pagemap_t *pm; + + uint64_t *stack_end; + uint64_t *stack_base; + + struct _sched_process *next; +} sched_process; + +extern sched_process *curr_proc; +extern sched_process *proc_list; + +// The idle process is ditched in favor of standby mode, +// which activates when there's nothing to run. +//extern sched_process *idle_process; + +void sched_init(); +sched_process *sched_create(char *name, uint64_t entry_point, uint32_t flags); +void sched_exit(sched_process *proc); +void schedule(registers_t *regs); \ No newline at end of file diff --git a/kernel/src/sys/arch/arch.h b/kernel/src/sys/arch/arch.h new file mode 100755 index 0000000..284f561 --- /dev/null +++ b/kernel/src/sys/arch/arch.h @@ -0,0 +1,5 @@ +#pragma once + +#define ENSURE_X86_64 #ifdef __x86_64__ + +#define ENDENSURE \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/cpuid.h b/kernel/src/sys/arch/x86_64/cpuid.h new file mode 100755 index 0000000..021f89e --- /dev/null +++ b/kernel/src/sys/arch/x86_64/cpuid.h @@ -0,0 +1,637 @@ +#ifndef __CPUID_H__ +#define __CPUID_H__ + +#include + +//=================CPUID_VENDOR================= +#define CPUID_VENDOR_INTEL "GenuineIntel" +#define CPUID_VENDOR_AMD "AuthenticAMD" + +//================CPUID_CPU_INFO================ +#define CPUID_CPU_INFO_EAX_STEPPING_MASK 0xF +#define CPUID_CPU_INFO_EAX_MODEL_MASK 0xF << 4 +#define CPUID_CPU_INFO_EAX_FAMILY_MASK 0xF << 8 +#define CPUID_CPU_INFO_EAX_TYPE_MASK 0x3 << 12 +#define CPUID_CPU_INFO_EAX_EXT_MODEL_MASK 0xF << 16 +#define CPUID_CPU_INFO_EAX_EXT_FAMILY_MASK 0xFF << 20 + +#define CPUID_CPU_INFO_EBX_BRAND_INDEX 0xFF +#define CPUID_CPU_INFO_EBX_CFLUSH_SIZE 0xFF << 8 +#define CPUID_CPU_INFO_EBX_MAX_LOGPROC 0xFF << 16 +#define CPUID_CPU_INFO_EBX_INIT_APIC_ID 0xFF << 25 + +#define CPUID_CPU_INFO_ECX_SSE3 1 << 0 +#define CPUID_CPU_INFO_ECX_PCLMULQDQ 1 << 1 +#define CPUID_CPU_INFO_ECX_DTES64 1 << 2 +#define CPUID_CPU_INFO_ECX_MONITOR 1 << 3 +#define CPUID_CPU_INFO_ECX_DS_CPL 1 << 4 +#define CPUID_CPU_INFO_ECX_VMX 1 << 5 +#define CPUID_CPU_INFO_ECX_SMX 1 << 6 +#define CPUID_CPU_INFO_ECX_EIST 1 << 7 +#define CPUID_CPU_INFO_ECX_TM2 1 << 8 +#define CPUID_CPU_INFO_ECX_SSSE3 1 << 9 +#define CPUID_CPU_INFO_ECX_CNXT_ID 1 << 10 +#define CPUID_CPU_INFO_ECX_SDBG 1 << 11 +#define CPUID_CPU_INFO_ECX_FMA 1 << 12 +#define CPUID_CPU_INFO_ECX_CMPXCHG16B 1 << 13 +#define CPUID_CPU_INFO_ECX_XTPR_UC 1 << 14 +#define CPUID_CPU_INFO_ECX_PDCM 1 << 15 +//bit 16 is reserved +#define CPUID_CPU_INFO_ECX_PCID 1 << 17 +#define CPUID_CPU_INFO_ECX_DCA 1 << 18 +#define CPUID_CPU_INFO_ECX_SSE4_1 1 << 19 +#define CPUID_CPU_INFO_ECX_SSE4_2 1 << 20 +#define CPUID_CPU_INFO_ECX_X2APIC 1 << 21 +#define CPUID_CPU_INFO_ECX_MOVBE 1 << 22 +#define CPUID_CPU_INFO_ECX_POPCNT 1 << 23 +#define CPUID_CPU_INFO_ECX_TSC_DEADLINE 1 << 24 +#define CPUID_CPU_INFO_ECX_AESNI 1 << 25 +#define CPUID_CPU_INFO_ECX_XSAVE 1 << 26 +#define CPUID_CPU_INFO_ECX_OSXSAVE 1 << 27 +#define CPUID_CPU_INFO_ECX_AVX 1 << 28 +#define CPUID_CPU_INFO_ECX_F16C 1 << 29 +#define CPUID_CPU_INFO_ECX_RDRAND 1 << 30 +//bit 31 is unused + +#define CPUID_CPU_INFO_EDX_FPU 1 << 0 +#define CPUID_CPU_INFO_EDX_VME 1 << 1 +#define CPUID_CPU_INFO_EDX_DE 1 << 2 +#define CPUID_CPU_INFO_EDX_PSE 1 << 3 +#define CPUID_CPU_INFO_EDX_TSC 1 << 4 +#define CPUID_CPU_INFO_EDX_MSR 1 << 5 +#define CPUID_CPU_INFO_EDX_PAE 1 << 6 +#define CPUID_CPU_INFO_EDX_MCE 1 << 7 +#define CPUID_CPU_INFO_EDX_CX8 1 << 8 +#define CPUID_CPU_INFO_EDX_APIC 1 << 9 +//bit 10 is reserved +#define CPUID_CPU_INFO_EDX_SEP 1 << 11 +#define CPUID_CPU_INFO_EDX_MTRR 1 << 12 +#define CPUID_CPU_INFO_EDX_PGE 1 << 13 +#define CPUID_CPU_INFO_EDX_MCA 1 << 14 +#define CPUID_CPU_INFO_EDX_CMOV 1 << 15 +#define CPUID_CPU_INFO_EDX_PAT 1 << 16 +#define CPUID_CPU_INFO_EDX_PSE_36 1 << 17 +#define CPUID_CPU_INFO_EDX_PSN 1 << 18 +#define CPUID_CPU_INFO_EDX_CLFSH 1 << 19 +//bit 20 is reserved +#define CPUID_CPU_INFO_EDX_DS 1 << 21 +#define CPUID_CPU_INFO_EDX_ACPI 1 << 22 +#define CPUID_CPU_INFO_EDX_MMX 1 << 23 +#define CPUID_CPU_INFO_EDX_FXSR 1 << 24 +#define CPUID_CPU_INFO_EDX_SSE 1 << 25 +#define CPUID_CPU_INFO_EDX_SSE2 1 << 26 +#define CPUID_CPU_INFO_EDX_SS 1 << 27 +#define CPUID_CPU_INFO_EDX_HTT 1 << 28 +#define CPUID_CPU_INFO_EDX_TM 1 << 29 +//bit 30 is reserved +#define CPUID_CPU_INFO_EDX_PBE 1 << 31 + +//===============CPUID_CACHE_TLB=============== +//WARNING: I gave up and used ChatGPT for these +#define CPUID_CACHE_TLB_DESC_NULL 0x00 +#define CPUID_CACHE_TLB_DESC_TLB_4_KBYTE_4WAY_32E 0x01 +#define CPUID_CACHE_TLB_DESC_TLB_4_MBYTE_FULLY_2E 0x02 +#define CPUID_CACHE_TLB_DESC_DTLB_4_KBYTE_4WAY_64E 0x03 +#define CPUID_CACHE_TLB_DESC_DTLB_4_MBYTE_4WAY_8E 0x04 +#define CPUID_CACHE_TLB_DESC_DTLB1_4_MBYTE_4WAY_32E 0x05 +#define CPUID_CACHE_TLB_DESC_L1_INST_8K_4WAY_32B 0x06 +#define CPUID_CACHE_TLB_DESC_L1_INST_16K_4WAY_32B 0x08 +#define CPUID_CACHE_TLB_DESC_L1_INST_32K_4WAY_64B 0x09 +#define CPUID_CACHE_TLB_DESC_L1_DATA_8K_2WAY_32B 0x0A +#define CPUID_CACHE_TLB_DESC_TLB_4_MBYTE_4WAY_4E 0x0B +#define CPUID_CACHE_TLB_DESC_L1_DATA_16K_4WAY_32B 0x0C +#define CPUID_CACHE_TLB_DESC_L1_DATA_16K_4WAY_64B 0x0D +#define CPUID_CACHE_TLB_DESC_L1_DATA_24K_6WAY_64B 0x0E +#define CPUID_CACHE_TLB_DESC_L2_128K_2WAY_64B 0x1D +#define CPUID_CACHE_TLB_DESC_L2_256K_8WAY_64B 0x21 +#define CPUID_CACHE_TLB_DESC_L3_512K_4WAY_64B_2LPS 0x22 +#define CPUID_CACHE_TLB_DESC_L3_1M_8WAY_64B_2LPS 0x23 +#define CPUID_CACHE_TLB_DESC_L2_1M_16WAY_64B 0x24 +#define CPUID_CACHE_TLB_DESC_L3_2M_8WAY_64B_2LPS 0x25 +#define CPUID_CACHE_TLB_DESC_L3_4M_8WAY_64B_2LPS 0x29 +#define CPUID_CACHE_TLB_DESC_L1_DATA_32K_8WAY_64B 0x2C +#define CPUID_CACHE_TLB_DESC_L1_INST_32K_8WAY_64B 0x30 +#define CPUID_CACHE_TLB_DESC_NO_L2_OR_L3 0x40 +#define CPUID_CACHE_TLB_DESC_L2_128K_4WAY_32B 0x41 +#define CPUID_CACHE_TLB_DESC_L2_256K_4WAY_32B 0x42 +#define CPUID_CACHE_TLB_DESC_L2_512K_4WAY_32B 0x43 +#define CPUID_CACHE_TLB_DESC_L2_1M_4WAY_32B 0x44 +#define CPUID_CACHE_TLB_DESC_L2_2M_4WAY_32B 0x45 +#define CPUID_CACHE_TLB_DESC_L3_4M_4WAY_64B 0x46 +#define CPUID_CACHE_TLB_DESC_L3_8M_8WAY_64B 0x47 +#define CPUID_CACHE_TLB_DESC_L2_3M_12WAY_64B 0x48 +#define CPUID_CACHE_TLB_DESC_L3_4M_16WAY_64B 0x49 +#define CPUID_CACHE_TLB_DESC_L3_6M_12WAY_64B 0x4A +#define CPUID_CACHE_TLB_DESC_L3_8M_16WAY_64B 0x4B +#define CPUID_CACHE_TLB_DESC_L3_12M_12WAY_64B 0x4C +#define CPUID_CACHE_TLB_DESC_L3_16M_16WAY_64B 0x4D +#define CPUID_CACHE_TLB_DESC_L2_6M_24WAY_64B 0x4E +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_32E 0x4F +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_2M_4M_64E 0x50 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_2M_4M_128E 0x51 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_2M_4M_256E 0x52 +#define CPUID_CACHE_TLB_DESC_TLB_INST_2M_4M_FULLY_7E 0x55 +#define CPUID_CACHE_TLB_DESC_DTLB0_4M_4WAY_16E 0x56 +#define CPUID_CACHE_TLB_DESC_DTLB0_4K_4WAY_16E 0x57 +#define CPUID_CACHE_TLB_DESC_DTLB0_4K_FULLY_16E 0x59 +#define CPUID_CACHE_TLB_DESC_DTLB0_2M_4M_4WAY_32E 0x5A +#define CPUID_CACHE_TLB_DESC_DTLB_4K_4M_64E 0x5B +#define CPUID_CACHE_TLB_DESC_DTLB_4K_4M_128E 0x5C +#define CPUID_CACHE_TLB_DESC_DTLB_4K_4M_256E 0x5D +#define CPUID_CACHE_TLB_DESC_L1_DATA_16K_8WAY_64B 0x60 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_FULLY_48E 0x61 +#define CPUID_CACHE_TLB_DESC_DTLB_2M_4M_32E_1G_4WAY_4E 0x63 +#define CPUID_CACHE_TLB_DESC_DTLB_4K_4WAY_512E 0x64 +#define CPUID_CACHE_TLB_DESC_L1_DATA_8K_4WAY_64B 0x66 +#define CPUID_CACHE_TLB_DESC_L1_DATA_16K_4WAY_64B_DUPLICATE 0x67 //???????????? +#define CPUID_CACHE_TLB_DESC_L1_DATA_32K_4WAY_64B 0x68 +#define CPUID_CACHE_TLB_DESC_UTLB_4K_8WAY_64E 0x6A +#define CPUID_CACHE_TLB_DESC_DTLB_4K_8WAY_256E 0x6B +#define CPUID_CACHE_TLB_DESC_DTLB_2M_4M_8WAY_128E 0x6C +#define CPUID_CACHE_TLB_DESC_DTLB_1G_FULLY_16E 0x6D +#define CPUID_CACHE_TLB_DESC_TRACE_12K_8WAY 0x70 +#define CPUID_CACHE_TLB_DESC_TRACE_16K_8WAY 0x71 +#define CPUID_CACHE_TLB_DESC_TRACE_32K_8WAY 0x72 +#define CPUID_CACHE_TLB_DESC_TLB_INST_2M_4M_FULLY_8E 0x76 +#define CPUID_CACHE_TLB_DESC_L2_1M_4WAY_64B 0x78 +#define CPUID_CACHE_TLB_DESC_L2_128K_8WAY_64B_2LPS 0x79 +#define CPUID_CACHE_TLB_DESC_L2_256K_8WAY_64B_2LPS 0x7A +#define CPUID_CACHE_TLB_DESC_L2_512K_8WAY_64B_2LPS 0x7B +#define CPUID_CACHE_TLB_DESC_L2_1M_8WAY_64B_2LPS 0x7C +#define CPUID_CACHE_TLB_DESC_L2_2M_8WAY_64B 0x7D +#define CPUID_CACHE_TLB_DESC_L2_512K_2WAY_64B 0x7F +#define CPUID_CACHE_TLB_DESC_L2_512K_8WAY_64B 0x80 +#define CPUID_CACHE_TLB_DESC_L2_256K_8WAY_32B 0x82 +#define CPUID_CACHE_TLB_DESC_L2_512K_8WAY_32B 0x83 +#define CPUID_CACHE_TLB_DESC_L2_1M_8WAY_32B 0x84 +#define CPUID_CACHE_TLB_DESC_L2_2M_8WAY_32B 0x85 +#define CPUID_CACHE_TLB_DESC_L2_512K_4WAY_64B 0x86 +#define CPUID_CACHE_TLB_DESC_L2_1M_8WAY_64B 0x87 +#define CPUID_CACHE_TLB_DESC_DTLB_4K_FULLY_ASSOC_32E 0xA0 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_4WAY_128E 0xB0 +#define CPUID_CACHE_TLB_DESC_TLB_INST_2M_4WAY_8E_4M_4WAY_4E 0xB1 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_4WAY_64E 0xB2 +#define CPUID_CACHE_TLB_DESC_TLB_DATA_4K_4WAY_128E 0xB3 +#define CPUID_CACHE_TLB_DESC_TLB_DATA_4K_4WAY_256E 0xB4 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_8WAY_64E 0xB5 +#define CPUID_CACHE_TLB_DESC_TLB_INST_4K_8WAY_128E 0xB6 +#define CPUID_CACHE_TLB_DESC_TLB_DATA_4K_4WAY_64E 0xBA +#define CPUID_CACHE_TLB_DESC_TLB_DATA_4K_4M_4WAY_8E 0xC0 +#define CPUID_CACHE_TLB_DESC_STLB_2ND_LEVEL_4K_2M_8WAY_1024E 0xC1 +#define CPUID_CACHE_TLB_DESC_DTLB_4K_2M_4WAY_16E 0xC2 +#define CPUID_CACHE_TLB_DESC_STLB_2ND_LEVEL_4K_2M_6WAY_1536E_1GB_4WAY_16E 0xC3 +#define CPUID_CACHE_TLB_DESC_DTLB_2M_4M_4WAY_32E 0xC4 +#define CPUID_CACHE_TLB_DESC_STLB_2ND_LEVEL_4K_4WAY_512E 0xCA +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_512KB_4WAY_64B_LINE 0xD0 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_1MB_4WAY_64B_LINE 0xD1 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_2MB_4WAY_64B_LINE 0xD2 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_1MB_8WAY_64B_LINE 0xD6 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_2MB_8WAY_64B_LINE 0xD7 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_4MB_8WAY_64B_LINE 0xD8 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_1_5MB_12WAY_64B_LINE 0xDC +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_3MB_12WAY_64B_LINE 0xDD +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_6MB_12WAY_64B_LINE 0xDE +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_2MB_16WAY_64B_LINE 0xE2 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_4MB_16WAY_64B_LINE 0xE3 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_8MB_16WAY_64B_LINE 0xE4 +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_12MB_24WAY_64B_LINE 0xEA +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_18MB_24WAY_64B_LINE 0xEB +#define CPUID_CACHE_TLB_DESC_CACHE_3RD_LEVEL_24MB_24WAY_64B_LINE 0xEC +#define CPUID_CACHE_TLB_DESC_PREFETCH_64_BYTE 0xF0 +#define CPUID_CACHE_TLB_DESC_PREFETCH_128_BYTE 0xF1 +#define CPUID_CACHE_TLB_DESC_NO_TLB_INFO_CPUID_LEAF_18H 0xFE +#define CPUID_CACHE_TLB_DESC_NO_CACHE_INFO_CPUID_LEAF_4 0xFF + +//=============CPUID_SERIAL_NUMBER============= +#define CPUID_SERIAL_NUMBER_STITCH(ECX,EDX) (uint64_t)((EDX << 32) | ECX) + +//=============CPUID_CACHE_PARAMS============== +#define CPUID_CACHE_PARAMS_EAX_CACHE_TYPE 0xF +#define CPUID_CACHE_PARAMS_EAX_CACHE_LEVEL 0x7 << 4 +#define CPUID_CACHE_PARAMS_EAX_IS_SELF_INIT 1 << 8 +#define CPUID_CACHE_PARAMS_EAX_IS_FULLY_ASSOCIATIVE 1 << 9 +// bits 10-13 are reserved +#define CPUID_CACHE_PARAMS_EAX_MAX_PROC_SHARING 0xFFF << 14 + +#define CPUID_CACHE_PARAMS_EAX_CACHE_TYPE_NULL 0x0 +#define CPUID_CACHE_PARAMS_EAX_CACHE_TYPE_DATA 0x1 +#define CPUID_CACHE_PARAMS_EAX_CACHE_TYPE_INSTRUCTION 0x2 +#define CPUID_CACHE_PARAMS_EAX_CACHE_TYPE_UNIFIED 0x3 + +#define CPUID_CACHE_PARAMS_EBX_COHERENCY_LINE_SIZE 0xFFF +#define CPUID_CACHE_PARAMS_EBX_PHYS_LINE_PARTITIONS 0x3FF << 12 +#define CPUID_CACHE_PARAMS_EBX_WAYS_OF_ASSOCIVITY 0x3FF + +#define CPUID_CACHE_PARAMS_EDX_CACHE_INCLUSIVENESS 1 +#define CPUID_CACHE_PARAMS_EDX_COMPLEX_CACHE_INDEXING 1 << 1 + +//=============CPUID_MONITOR_MWAIT============= +#define CPUID_MONITOR_MWAIT_ECX_ENUM_EXTENSIONS 1 +#define CPUID_MONITOR_MWAIT_ECX_BREAK_EVENTS 1 << 1 + +#define CPUID_MONITOR_MWAIT_EDX_C0_SUBC_STATES 0xF +#define CPUID_MONITOR_MWAIT_EDX_C1_SUBC_STATES 0xF << 4 +#define CPUID_MONITOR_MWAIT_EDX_C2_SUBC_STATES 0xF << 8 +#define CPUID_MONITOR_MWAIT_EDX_C3_SUBC_STATES 0xF << 12 +#define CPUID_MONITOR_MWAIT_EDX_C4_SUBC_STATES 0xF << 16 +#define CPUID_MONITOR_MWAIT_EDX_C5_SUBC_STATES 0xF << 20 +#define CPUID_MONITOR_MWAIT_EDX_C6_SUBC_STATES 0xF << 24 +#define CPUID_MONITOR_MWAIT_EDX_C7_SUBC_STATES 0xF << 28 + +//===========CPUID_THERMAL_AND_POWER=========== +#define CPUID_THERMAL_AND_POWER_EAX_TEMP_SENSOR 1 +#define CPUID_THERMAL_AND_POWER_EAX_TURBO_BOOST 1 << 1 +#define CPUID_THERMAL_AND_POWER_EAX_ARAT 1 << 2 +//Bit 3 is reserved +#define CPUID_THERMAL_AND_POWER_EAX_PLN 1 << 3 +#define CPUID_THERMAL_AND_POWER_EAX_ECMD 1 << 5 +#define CPUID_THERMAL_AND_POWER_EAX_PTM 1 << 6 +#define CPUID_THERMAL_AND_POWER_EAX_HWP 1 << 7 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_NOTIFICATION 1 << 8 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_ACT_WINDOW 1 << 9 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_PERF_PREF 1 << 10 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_PKG_LVL_REQ 1 << 11 +//Bit 12 is reserved +#define CPUID_THERMAL_AND_POWER_EAX_HDC 1 << 13 +#define CPUID_THERMAL_AND_POWER_EAX_TURBO_BOOST_MAX 1 << 14 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_CAPABILITIES 1 << 15 +#define CPUID_THERMAL_AND_POWER_EAX_HWP_PECI 1 << 16 +#define CPUID_THERMAL_AND_POWER_EAX_FLEXIBLE_HWP 1 << 17 +#define CPUID_THERMAL_AND_POWER_EAX_FAST_HWP_REQUEST 1 << 18 +#define CPUID_THERMAL_AND_POWER_EAX_HW_FEEDBACK 1 << 19 +#define CPUID_THERMAL_AND_POWER_EAX_IGNORE_HWP_IDLE 1 << 20 +//Bits 21 and 22 are reserved +#define CPUID_THERMAL_AND_POWER_EAX_THREAD_DIRECTOR 1 << 23 +#define CPUID_THERMAL_AND_POWER_EAX_THERM_INTERRUPT 1 << 24 + +#define CPUID_THERMAL_AND_POWER_EBX_INT_TRESHOLD 0xf + +#define CPUID_THERMAL_AND_POWER_ECX_HW_COORD_FEEDBACK 1 +#define CPUID_THERMAL_AND_POWER_ECX_ENERGY_PERF_BIAS 1 << 3 +#define CPUID_THERMAL_AND_POWER_ECX_TD_CLASSES 0xff << 8 + +#define CPUID_THERMAL_AND_POWER_EDX_PERF_REPORT 1 +#define CPUID_THERMAL_AND_POWER_EDX_EFFICIENCY_REPORT 1 << 1 +#define CPUID_THERMAL_AND_POWER_EDX_HW_FEEDBACK_SIZE 0xf << 8 +#define CPUID_THERMAL_AND_POWER_EDX_THIS_PROC_HW_FB 0xffff << 16 + +//===========CPUID_EXTENDED_FEATURES=========== +#define CPUID_EXTENDED_FEATURES_EBX_FSGSBASE 1 +#define CPUID_EXTENDED_FEATURES_EBX_TSC_ADJUST 1 << 1 +#define CPUID_EXTENDED_FEATURES_EBX_SGX 1 << 2 +#define CPUID_EXTENDED_FEATURES_EBX_BMI1 1 << 3 +#define CPUID_EXTENDED_FEATURES_EBX_HLE 1 << 4 +#define CPUID_EXTENDED_FEATURES_EBX_AVX2 1 << 5 +#define CPUID_EXTENDED_FEATURES_EBX_FDP_EXCPTN_ONLY 1 << 6 +#define CPUID_EXTENDED_FEATURES_EBX_SMEP 1 << 7 +#define CPUID_EXTENDED_FEATURES_EBX_BMI2 1 << 8 +#define CPUID_EXTENDED_FEATURES_EBX_ENHANCED_REP 1 << 9 +#define CPUID_EXTENDED_FEATURES_EBX_INVCIP 1 << 10 +#define CPUID_EXTENDED_FEATURES_EBX_RTM 1 << 11 +#define CPUID_EXTENDED_FEATURES_EBX_RDT_M 1 << 12 +#define CPUID_EXTENDED_FEATURES_EBX_NO_FPU_CS 1 << 13 +#define CPUID_EXTENDED_FEATURES_EBX_MPX 1 << 14 +#define CPUID_EXTENDED_FEATURES_EBX_RDT_A 1 << 15 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512F 1 << 16 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512DQ 1 << 17 +#define CPUID_EXTENDED_FEATURES_EBX_RDSEED 1 << 18 +#define CPUID_EXTENDED_FEATURES_EBX_ADX 1 << 19 +#define CPUID_EXTENDED_FEATURES_EBX_SMAP 1 << 20 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512_IFMA 1 << 21 +// Bit 22 is reserved +#define CPUID_EXTENDED_FEATURES_EBX_CLFLUSHOPT 1 << 23 +#define CPUID_EXTENDED_FEATURES_EBX_CLWB 1 << 24 +#define CPUID_EXTENDED_FEATURES_EBX_TRACE 1 << 25 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512PF 1 << 26 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512ER 1 << 27 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512CD 1 << 28 +#define CPUID_EXTENDED_FEATURES_EBX_SHA 1 << 29 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512BW 1 << 30 +#define CPUID_EXTENDED_FEATURES_EBX_AVX512VL 1 << 31 + +#define CPUID_EXTENDED_FEATURES_ECX_PREFETCHWT1 1 +#define CPUID_EXTENDED_FEATURES_ECX_AFX512_VBMI 1 << 1 +#define CPUID_EXTENDED_FEATURES_ECX_UMIP 1 << 2 +#define CPUID_EXTENDED_FEATURES_ECX_PKU 1 << 3 +#define CPUID_EXTENDED_FEATURES_ECX_OSPKE 1 << 4 +#define CPUID_EXTENDED_FEATURES_ECX_WAITPKG 1 << 5 +#define CPUID_EXTENDED_FEATURES_ECX_AVX512_VBMI2 1 << 6 +#define CPUID_EXTENDED_FEATURES_ECX_CET_SS 1 << 7 +#define CPUID_EXTENDED_FEATURES_ECX_GFNI 1 << 8 +#define CPUID_EXTENDED_FEATURES_ECX_VAES 1 << 9 +#define CPUID_EXTENDED_FEATURES_ECX_VPCLMULQDQ 1 << 10 +#define CPUID_EXTENDED_FEATURES_ECX_AVX512_VNNI 1 << 11 +#define CPUID_EXTENDED_FEATURES_ECX_AVX512_BITLANG 1 << 12 +#define CPUID_EXTENDED_FEATURES_ECX_TME_EN 1 << 13 +#define CPUID_EXTENDED_FEATURES_ECX_AVX512_VPOPVNZDQ 1 << 14 +//bit 15 is reserved +#define CPUID_EXTENDED_FEATURES_ECX_LA57 1 << 16 +#define CPUID_EXTENDED_FEATURES_ECX_MAWAU_VAL 0x1F << 17 +#define CPUID_EXTENDED_FEATURES_ECX_RDPID 1 << 22 +#define CPUID_EXTENDED_FEATURES_ECX_KL 1 << 23 +#define CPUID_EXTENDED_FEATURES_ECX_BUS_LOCK_DETECT 1 << 24 +#define CPUID_EXTENDED_FEATURES_ECX_CLDEMOTE 1 << 25 +//bit 26 is reserved +#define CPUID_EXTENDED_FEATURES_ECX_MOVDIRI 1 << 27 +#define CPUID_EXTENDED_FEATURES_ECX_MOVDIR64B 1 << 28 +#define CPUID_EXTENDED_FEATURES_ECX_ENQCMD 1 << 29 +#define CPUID_EXTENDED_FEATURES_ECX_SGX_LC 1 << 30 +#define CPUID_EXTENDED_FEATURES_ECX_PKS 1 << 31 + +//bit 0 is reserved +#define CPUID_EXTENDED_FEATURES_EDX_SGX_KEYS 1 << 1 +#define CPUID_EXTENDED_FEATURES_EDX_AVX512_4VNNIW 1 << 2 +#define CPUID_EXTENDED_FEATURES_EDX_AVX512_4FMAPS 1 << 3 +#define CPUID_EXTENDED_FEATURES_EDX_FAST_REP_MOV 1 << 4 +#define CPUID_EXTENDED_FEATURES_EDX_UINTR 1 << 5 +//bits 6 and 7 are reserved +#define CPUID_EXTENDED_FEATURES_EDX_AVX512_VPINTERSECT 1 << 8 // intel you son of a bitch +#define CPUID_EXTENDED_FEATURES_EDX_SRBDS_CTRL 1 << 9 +#define CPUID_EXTENDED_FEATURES_EDX_MD_CLEAR 1 << 10 +#define CPUID_EXTENDED_FEATURES_EDX_RTM_ALWAYS_ABORT 1 << 11 +//bit 12 is reserved +#define CPUID_EXTENDED_FEATURES_EDX_RTM_FORCE_ABORT 1 << 13 +#define CPUID_EXTENDED_FEATURES_EDX_SERIALIZE 1 << 14 +#define CPUID_EXTENDED_FEATURES_EDX_HYBRID 1 << 15 +#define CPUID_EXTENDED_FEATURES_EDX_TSXLDTRK 1 << 16 +//bit 17 is reserved +#define CPUID_EXTENDED_FEATURES_EDX_PCONFIG 1 << 18 +#define CPUID_EXTENDED_FEATURES_EDX_ARCHITECTURAL_LBR 1 << 19 +#define CPUID_EXTENDED_FEATURES_EDX_CET_IBT 1 << 20 +//bit 21 is reserved +#define CPUID_EXTENDED_FEATURES_EDX_AMX_BF16 1 << 22 +#define CPUID_EXTENDED_FEATURES_EDX_AVX512_FP16 1 << 23 +#define CPUID_EXTENDED_FEATURES_EDX_AMX_TILE 1 << 24 +#define CPUID_EXTENDED_FEATURES_EDX_AMX_INT8 1 << 25 +#define CPUID_EXTENDED_FEATURES_EDX_IBRS 1 << 26 +#define CPUID_EXTENDED_FEATURES_EDX_STIBP 1 << 27 +#define CPUID_EXTENDED_FEATURES_EDX_L1D_FLUSH 1 << 28 +#define CPUID_EXTENDED_FEATURES_EDX_ARCH_CAPABS_MSR 1 << 29 +#define CPUID_EXTENDED_FEATURES_EDX_CORE_CAPABS_MSR 1 << 30 +#define CPUID_EXTENDED_FEATURES_EDX_SSBD 1 << 31 + +//=========CPUID_EXTENDED_FEATURES_SL1========= +//bits 0-3 are reserved +#define CPUID_EXTENDED_FEATURES_SL1_EAX_AVX_VNNI 1 << 4 +#define CPUID_EXTENDED_FEATURES_SL1_EAX_AVX512_BF16 1 << 5 +//bits 6-9 are reserved +#define CPUID_EXTENDED_FEATURES_SL1_EAX_0_REP_MOVSB 1 << 10 +#define CPUID_EXTENDED_FEATURES_SL1_EAX_FAST_STOSB 1 << 11 +#define CPUID_EXTENDED_FEATURES_SL1_EAX_FAST_CMPSB 1 << 12 +//bits 13-21 are reserved +#define CPUID_EXTENDED_FEATURES_SL1_EAX_HRESET 1 << 22 +//bits 23-19 are reserved +#define CPUID_EXTENDED_FEATURES_SL1_EAX_INVD_POSTPOST 1 << 30 +//bit 31 is reserved + +#define CPUID_EXTENDED_FEATURES_SL1_EBX_PPIN 1 + +#define CPUID_EXTENDED_FEATURES_SL1_EDX_CET_SSS 1 << 18 + +//=========CPUID_EXTENDED_FEATURES_SL2========= +#define CPUID_EXTENDED_FEATURES_SL2_EDX_PSFD 1 +#define CPUID_EXTENDED_FEATURES_SL2_EDX_IPRED_CTRL 1 << 1 +#define CPUID_EXTENDED_FEATURES_SL2_EDX_RRSBA_CTRL 1 << 2 +#define CPUID_EXTENDED_FEATURES_SL2_EDX_DDPD_U 1 << 3 +#define CPUID_EXTENDED_FEATURES_SL2_EDX_BHI_CTRL 1 << 4 +//The rest of the bits are reserved + + +enum leaves { + /* @ Basic CPU info + * @ Returned EAX: Highest basic CPUID leaf present + * @ Returned EBX: First 4 letters of the vendor identifier string + * @ Returned ECX: Third 4 letters of the vendor identifier string + * @ Retruned EDX: Second 4 letters of the vendor identifier string + */ + CPUID_VENDOR = 0x00000000, + /* @ CPU Version information + * @ Returned EAX: Family,Model,Stepping + * @ Returned EBX: Brand Index,CLFLUSH line size, Max number of logical processors + * @ Returned ECX: Featrue information + * @ Retruned EDX: More feature information + */ + CPUID_CPU_INFO = 0x00000001, + /* @ CPU Cache and TLB information + * @ Returned EAX: 4 Cache, prefetch or TLB descriptors + * @ Returned EBX: 4 Cache, prefetch or TLB descriptors + * @ Returned ECX: 4 Cache, prefetch or TLB descriptors + * @ Retruned EDX: 4 Cache, prefetch or TLB descriptors + */ + CPUID_CACHE_TLB = 0x00000002, + /* @ CPU Serial Number !!! PENTIUM 3 ONLY !!! + * @ Returned EAX: Reserved + * @ Returned EBX: Reserved + * @ Returned ECX: bits 0-31 of the serial number + * @ Retruned EDX: bits 32-63 of the serial number + */ + CPUID_SERIAL_NUMBER = 0x00000003, + /* @ CPU Deterministic cache parameters !!! Initial ECX = Cache level !!! + * @ Returned EAX: Cache level,Is self init,Is fully associative,Maximum number of addressable IDs for logical processors sharing this cache + * @ Returned EBX: L, P and W + * @ Returned ECX: S + * @ Retruned EDX: Cache inclusiveness and Complex Cache indexing + */ + CPUID_CACHE_PARAMS = 0x00000004, + /* @ MONITOR/MWAIT params + * @ Returned EAX: Smallest monitor-line size + * @ Returned EBX: Largest monitor-line size + * @ Returned ECX: Enumeration of Monitor-Mwait extensions,Supports treating interrupts as break-event for MWAIT + * @ Retruned EDX: Number of sub C-states supported using MWAIT for each C number thingy IDK + */ + CPUID_MONITOR_MWAIT = 0x00000005, + /* @ Thermal and power managment + * @ Returned EAX: Thermal and power info + * @ Returned EBX: Thermal and power info + * @ Returned ECX: Thermal and power info + * @ Retruned EDX: Thermal and power info + */ + CPUID_THERMAL_AND_POWER = 0x00000006, + /* @ Extended features + * @ Returned EAX: Number of subleaves supported + * @ Returned EBX: Features + * @ Returned ECX: Features + * @ Retruned EDX: Features + */ + CPUID_EXTENDED_FEATURES = 0x00000007, + /* @ Direct Cache Access Information + * @ Returned EAX: Value of the MSR "IA32_PLATFORM_DCA_CAP" + * @ Returned EBX: Reserved + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_CACHE_ACCESS_INFO = 0x00000009, + CPUID_PERFORMANCE_MONITORING = 0x0000000A, + CPUID_EXTENDENDED_TOPOLOGY = 0x0000000B, + CPUID_EXTENDENDED_TOPOLOGY2 = 0x0000000D, + CPUID_INTEL_RDT = 0x0000000F, + CPUID_INTEL_RDT2 = 0x00000010, + CPUID_INTEL_SGX = 0x00000012, + CPUID_CPU_TRACE_ENUM = 0x00000014, + CPUID_TSC = 0x00000015, + CPUID_CPU_FREQ_INFO = 0x00000016, + CPUID_SOC_VENDOR = 0x00000017, + CPUID_DETERMINISTIC_ADRESS_TRANSLATION_PARAMS = 0x00000018, + CPUID_KEY_LOCKER = 0x000000019, + CPUID_NATIVE_MODEL_ID = 0x0000001A, + CPUID_PCONFIG_INFO = 0x0000001B, + CPUID_LAST_BRACH = 0x00000001C, + CPUID_TILE_INFO = 0x00000001D, + CPUID_TMUL_INFO = 0x00000001E, + CPUID_V2_EXTENDED_TOPOLOGY = 0x00000001F, + CPUID_V2_EXTENDED_TOPOLOGY2 = 0x000000020, + //TODO: add the bitmasks for these Microsoft ones + /* @ Hypervisor CPUID Leaf Range + * @ Returned EAX: Highest hypervisor CPUID leaf present + * @ Returned EBX: Largest monitor-line size + * @ Returned ECX: Enumeration of Monitor-Mwait extensions,Supports treating interrupts as break-event for MWAIT + * @ Retruned EDX: Number of sub C-states supported using MWAIT for each C number thingy IDK + */ + CPUID_HYPERV_IDENT = 0x40000000, + /* @ Hypervisor Vendor-Neutral Interface Identification + * @ Returned EAX: Hypervisor interface signature + * @ Returned EBX: Reserved + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_INTERFCE_IDENT = 0x40000001, + /* @ Hypervisor System Identity + * @ Returned EAX: Build number + * @ Returned EBX: Major and minor version + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_SYSTEM_IDENT = 0x40000002, + /* @ Hypervisor Feature Identification + * @ Returned EAX: bits 0-31 of HV_PARTITION_PRIVILEGE_MASK + * @ Returned EBX: bits 31-63 of HV_PARTITION_PRIVILEGE_MASK + * @ Returned ECX: Hyper-V features + * @ Retruned EDX: Hyper-V features + */ + CPUID_MS_HYPERV_FEATURE_IDENT = 0x40000003, + /* @ Implementation Recommendations + * @ Returned EAX: Hyper-V feature recommendations + * @ Returned EBX: Hyper-V feature recommendations + * @ Returned ECX: Hyper-V feature recommendations + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_RECOMMENDATIONS = 0x40000004, + /* @ Hypervisor Implementation Limits + * @ Returned EAX: The maximum number of virtual processors supported + * @ Returned EBX: The maximum number of logical processors supported + * @ Returned ECX: The maximum number of physical interrupt vectors available for interrupt remapping. + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_IMPL_LIMITS = 0x40000005, + /* @ Implementation Hardware Features + * @ Returned EAX: Hardware features + * @ Returned EBX: Reserved + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_HARDWARE_FEATURES = 0x40000006, + /* @ Nested Hypervisor Feature Identification + * @ Returned EAX: Nested Hypervisor features + * @ Returned EBX: Reserved + * @ Returned ECX: Reserved + * @ Retruned EDX: Nested Hypervisor features + */ + CPUID_MS_HYPERV_NESTED_FEATURES = 0x40000009, + /* @ Nested Hypervisor Nested Virtualization Features + * @ Returned EAX: Nested Hypervisor features + * @ Returned EBX: Nested Hypervisor features + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_MS_HYPERV_NESTED_OPTIMISATIONS = 0x4000000A, + /* @ Extended processor signature + * @ Returned EAX: Reserved + * @ Returned EBX: Reserved + * @ Returned ECX: Extended feature bits + * @ Retruned EDX: Extended feature bits + */ + CPUID_EXTENDED_SIGNATURE = 0x800000001, + /* @ Full CPU name + * @ Returned EAX: First 4 characters of the full CPU name + * @ Returned EBX: Second 4 characters of the full CPU name + * @ Returned ECX: Third 4 characters of the full CPU name + * @ Retruned EDX: Fourth 4 characters of the full CPU name + */ + CPUID_BRAND_STRING1 = 0x800000002, + /* @ Full CPU name 2 + * @ Returned EAX: Fifth 4 characters of the full CPU name + * @ Returned EBX: Sexth 4 characters of the full CPU name + * @ Returned ECX: Seventh 4 characters of the full CPU name + * @ Retruned EDX: Eightth 4 characters of the full CPU name + */ + CPUID_BRAND_STRING2 = 0x800000003, + /* @ Full CPU name 3 + * @ Returned EAX: Nineth 4 characters of the full CPU name + * @ Returned EBX: Tenth 4 characters of the full CPU name + * @ Returned ECX: Eleventh 4 characters of the full CPU name + * @ Retruned EDX: Twelveth 4 characters of the full CPU name + */ + CPUID_BRAND_STRING3 = 0x800000004, + /* @ Cache line size and associativity + * @ Returned EAX: Reserved + * @ Returned EBX: Reserved + * @ Returned ECX: Bits 0-7 = Cache line size in bytes, Bits 12-15 = L2 Associativity, Bits 16-31 = Cache size in 1K blocks + * @ Retruned EDX: Reserved + */ + CPUID_MORE_CACHE = 0x800000006, + /* @ Invariant TSC available + * @ Returned EAX: Reserved + * @ Returned EBX: Reserved + * @ Returned ECX: Bit 8 = Invariant TSC available + * @ Retruned EDX: Reserved + */ + CPUID_INVARIANT_TSC_AVAILABLE = 0x800000007, + /* @ Physical adress size + * @ Returned EAX: Bits 0-7 = Physical Adress bits, Bits 8-15 = Linear Address bits + * @ Returned EBX: Bit 9 = WBNOINVD available + * @ Returned ECX: Reserved + * @ Retruned EDX: Reserved + */ + CPUID_PHYS_ADDR_SIZE = 0x800000008, +}; + +enum sub_leaves{ + /* @ Extended features available subleaf 1 !!! All fields return 0 is info not available !!! + * @ Returned EAX: Features + * @ Returned EBX: PPIN + * @ Returned ECX: Reserved + * @ Retruned EDX: CET_SSS + */ + CPUID_EXTENDED_FEATURES_SL1 = 0x00000001, + /* @ Extended features available subleaf 2 !!! All fields return 0 is info not available !!! + * @ Returned EAX: Reserved + * @ Returned EBX: Reserved + * @ Returned ECX: Reserved + * @ Retruned EDX: Features + */ + CPUID_EXTENDED_FEATURES_SL2 = 0x00000002, + CPUID_INTEL_RDT_CAPABILITY = 0x00000001, + CPUID_INTEL_RDT2_ALLOCATION = 0x00000000, + CPUID_INTEL_RDT2_RESID1 = 0x00000001, + CPUID_INTEL_RDT2_RESID2 = 0x00000002, + CPUID_INTEL_RDT2_RESID3 = 0x00000003, + CPUID_INTEL_SGX_SL1 = 0x00000001, + CPUID_INTEL_SGX_SL2 = 0x00000002, + CPUID_CPU_TRACE_ENUM_SL = 0x00000001, + CPUID_SOC_VENDOR_SL1 = 0x00000001, + CPUID_SOC_VENDOR_SL2 = 0x00000002, + CPUID_SOC_VENDOR_SL3 = 0x00000003, + //NOTE: goes higher than 1 + CPUID_DETERMINISTIC_ADRESS_TRANSLATION_PARAMS_SL = 0x00000001, + CPUID_TILE_INFO_PALETTE1 = 0x000000001, +}; + +static inline void cpuid(int leaf, int subleaf, int* a, int* b, int* c, int* d) { + __asm__ __volatile__ ( + "cpuid" + : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d) + : "a" (leaf), "c" (subleaf) + ); +} + +#endif // __CPUID_H__ \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/gdt.c b/kernel/src/sys/arch/x86_64/gdt.c new file mode 100755 index 0000000..0559625 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/gdt.c @@ -0,0 +1,53 @@ +//#include "sys/log.h" +#include +#include +#include + +gdt_table def_table = { + { + 0x0000000000000000, // 0x00 + + 0x00009a000000ffff, // 0x08 16 bit code + 0x000093000000ffff, // 0x10 16 bit data + + 0x00cf9a000000ffff, // 0x18 32 bit code + 0x00cf93000000ffff, // 0x20 32 bit data + + 0x00af9b000000ffff, // 0x28 64 bit code cs + 0x00af93000000ffff, // 0x30 64 bit data ss + + 0x00aff3000000ffff, // 0x38 data ss + 0x00affb000000ffff, // 0x40 user mode code cs + }, + { + } +}; + +tssr tss_list[256]; // One tssr per CPU + +void gdt_init() { + + // TODO: adapt for multiprocessor kernel + tss_list[0].iopb = sizeof(tssr); + uintptr_t tss = (uintptr_t)&tss_list[0]; + + def_table.tss_entry.length = sizeof(tss_entry); + def_table.tss_entry.base = (uint16_t)(tss & 0xffff); + def_table.tss_entry.base1 = (uint8_t)((tss >> 16) & 0xff); + def_table.tss_entry.flags = 0x89; + def_table.tss_entry.flags1 = 0; + def_table.tss_entry.base2 = (uint8_t)((tss >> 24) & 0xff); + def_table.tss_entry.base3 = (uint32_t)(tss >> 32); + def_table.tss_entry.resv = 0; + + gdtr gdt = (gdtr){ + .size = (sizeof(gdt_table)) - 1, + .address = (uint64_t)&def_table + }; + + __asm__ volatile ("lgdt %0\n\t" : : "m"(gdt) : "memory"); + __asm__ volatile ("ltr %0\n\t" : : "r"((uint16_t)0x48)); + + //logln(progress, "kinit stage 1", "GDT initialized\n"); + log("gdt - initialized.\n"); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/gdt.h b/kernel/src/sys/arch/x86_64/gdt.h new file mode 100755 index 0000000..8e51e53 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/gdt.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +typedef struct { + uint16_t length; + uint16_t base; + uint8_t base1; + uint8_t flags; + uint8_t flags1; + uint8_t base2; + uint32_t base3; + uint32_t resv; +} __attribute__((packed)) tss_entry; + +typedef struct { + uint64_t gdt_entries[9]; + tss_entry tss_entry; +} __attribute__((packed)) gdt_table; + +typedef struct { + uint16_t size; + uint64_t address; +} __attribute__((packed)) gdtr; + + +typedef struct { + uint32_t resv; + uint64_t rsp[3]; + uint64_t resv1; + uint64_t ist[7]; + uint64_t resv2; + uint16_t resv3; + uint16_t iopb; +} __attribute__((packed)) tssr; // Per CPU + +void gdt_init(); \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/idt.c b/kernel/src/sys/arch/x86_64/idt.c new file mode 100755 index 0000000..37b058a --- /dev/null +++ b/kernel/src/sys/arch/x86_64/idt.c @@ -0,0 +1,44 @@ +//#include "sys/log.h" +#include "sys/arch/x86_64/pic.h" +#include +#include + +__attribute__((aligned(0x10))) +static idt_entry_t idt[256]; + +static idtr_t idtr; + +void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags) { + idt_entry_t* descriptor = &idt[vector]; + + descriptor->isr_low = (uint64_t)isr & 0xFFFF; + descriptor->kernel_cs = 0x28; + descriptor->ist = 0; + descriptor->attributes = flags; + descriptor->isr_mid = ((uint64_t)isr >> 16) & 0xFFFF; + descriptor->isr_high = ((uint64_t)isr >> 32) & 0xFFFFFFFF; + descriptor->reserved = 0; +} + +static int vectors[256]; + +extern void* isr_stub_table[]; + +void idt_init() { + idtr.base = (uintptr_t)&idt[0]; + idtr.limit = (uint16_t)sizeof(idt_entry_t) * 256 - 1; + + for (uint16_t vector = 0; vector <= 256; vector++) { + idt_set_descriptor(vector, isr_stub_table[vector], 0x8E); + vectors[vector] = 1; + } + + pic_init(); + pic_unmask_irq(1); + + __asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT + __asm__ volatile ("sti"); // set the interrupt flag + + //logln(progress, "kinit stage 1", "IDT initialized! Time to receive interrupts!\n"); + log("idt - initialized\n"); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/idt.h b/kernel/src/sys/arch/x86_64/idt.h new file mode 100755 index 0000000..8416f5e --- /dev/null +++ b/kernel/src/sys/arch/x86_64/idt.h @@ -0,0 +1,51 @@ +#pragma once + +#include + +typedef struct { + uint64_t r15; + uint64_t r14; + uint64_t r13; + uint64_t r12; + uint64_t r11; + uint64_t r10; + uint64_t r9; + uint64_t r8; + uint64_t rdi; + uint64_t rsi; + uint64_t rbp; + uint64_t rbx; + uint64_t rdx; + uint64_t rcx; + uint64_t rax; + uint64_t int_no; + uint64_t err_code; + uint64_t rip; + uint64_t cs; + uint64_t rflags; + uint64_t rsp; + uint64_t ss; +} __attribute__((packed)) registers_t; + +typedef struct stackframe { + struct stackframe* rbp; + uint64_t rip; +} stackframe_t; + +typedef struct { + uint16_t isr_low; // The lower 16 bits of the ISR's address + uint16_t kernel_cs; // The GDT segment selector that the CPU will load into CS before calling the ISR + uint8_t ist; // The IST in the TSS that the CPU will load into RSP; set to zero for now + uint8_t attributes; // Type and attributes; see the IDT page + uint16_t isr_mid; // The higher 16 bits of the lower 32 bits of the ISR's address + uint32_t isr_high; // The higher 32 bits of the ISR's address + uint32_t reserved; // Set to zero +} __attribute__((packed)) idt_entry_t; + +typedef struct { + uint16_t limit; + uint64_t base; +} __attribute__((packed)) idtr_t; + +void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags); +void idt_init(void); \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/interrupts.asm b/kernel/src/sys/arch/x86_64/interrupts.asm new file mode 100755 index 0000000..860dc37 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/interrupts.asm @@ -0,0 +1,335 @@ +%macro pushall 0 + push rax + push rcx + push rdx + push rbx + push rbp + push rsi + push rdi + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 +%endmacro + +%macro popall 0 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rdi + pop rsi + pop rbp + pop rbx + pop rdx + pop rcx + pop rax +%endmacro + +%macro isr_err_stub 1 +isr_stub_%+%1: + + push %1 + pushall + + mov rdi, rsp + + call exception_handler + + popall + + add rsp, 16 + iretq +%endmacro + +%macro isr_no_err_stub 1 +isr_stub_%+%1: + push 0 + push %1 + pushall + + mov rdi, rsp + + call exception_handler + + popall + + add rsp, 16 + iretq +%endmacro + +extern exception_handler +isr_no_err_stub 0 +isr_no_err_stub 1 +isr_no_err_stub 2 +isr_no_err_stub 3 +isr_no_err_stub 4 +isr_no_err_stub 5 +isr_no_err_stub 6 +isr_no_err_stub 7 +isr_err_stub 8 +isr_no_err_stub 9 +isr_err_stub 10 +isr_err_stub 11 +isr_err_stub 12 +isr_err_stub 13 +isr_err_stub 14 +isr_no_err_stub 15 +isr_no_err_stub 16 +isr_err_stub 17 +isr_no_err_stub 18 +isr_no_err_stub 19 +isr_no_err_stub 20 +isr_no_err_stub 21 +isr_no_err_stub 22 +isr_no_err_stub 23 +isr_no_err_stub 24 +isr_no_err_stub 25 +isr_no_err_stub 26 +isr_no_err_stub 27 +isr_no_err_stub 28 +isr_no_err_stub 29 +isr_err_stub 30 +isr_no_err_stub 31 + + +isr_no_err_stub 32 +isr_no_err_stub 33 +isr_no_err_stub 34 +isr_no_err_stub 35 +isr_no_err_stub 36 +isr_no_err_stub 37 +isr_no_err_stub 38 +isr_no_err_stub 39 +isr_no_err_stub 40 +isr_no_err_stub 41 +isr_no_err_stub 42 +isr_no_err_stub 43 +isr_no_err_stub 44 +isr_no_err_stub 45 +isr_no_err_stub 46 +isr_no_err_stub 47 +isr_no_err_stub 48 +isr_no_err_stub 49 +isr_no_err_stub 50 +isr_no_err_stub 51 +isr_no_err_stub 52 +isr_no_err_stub 53 +isr_no_err_stub 54 +isr_no_err_stub 55 +isr_no_err_stub 56 +isr_no_err_stub 57 +isr_no_err_stub 58 +isr_no_err_stub 59 +isr_no_err_stub 60 +isr_no_err_stub 61 +isr_no_err_stub 62 +isr_no_err_stub 63 +isr_no_err_stub 64 +isr_no_err_stub 65 +isr_no_err_stub 66 +isr_no_err_stub 67 +isr_no_err_stub 68 +isr_no_err_stub 69 +isr_no_err_stub 70 +isr_no_err_stub 71 +isr_no_err_stub 72 +isr_no_err_stub 73 +isr_no_err_stub 74 +isr_no_err_stub 75 +isr_no_err_stub 76 +isr_no_err_stub 77 +isr_no_err_stub 78 +isr_no_err_stub 79 +isr_no_err_stub 80 +isr_no_err_stub 81 +isr_no_err_stub 82 +isr_no_err_stub 83 +isr_no_err_stub 84 +isr_no_err_stub 85 +isr_no_err_stub 86 +isr_no_err_stub 87 +isr_no_err_stub 88 +isr_no_err_stub 89 +isr_no_err_stub 90 +isr_no_err_stub 91 +isr_no_err_stub 92 +isr_no_err_stub 93 +isr_no_err_stub 94 +isr_no_err_stub 95 +isr_no_err_stub 96 +isr_no_err_stub 97 +isr_no_err_stub 98 +isr_no_err_stub 99 +isr_no_err_stub 100 +isr_no_err_stub 101 +isr_no_err_stub 102 +isr_no_err_stub 103 +isr_no_err_stub 104 +isr_no_err_stub 105 +isr_no_err_stub 106 +isr_no_err_stub 107 +isr_no_err_stub 108 +isr_no_err_stub 109 +isr_no_err_stub 110 +isr_no_err_stub 111 +isr_no_err_stub 112 +isr_no_err_stub 113 +isr_no_err_stub 114 +isr_no_err_stub 115 +isr_no_err_stub 116 +isr_no_err_stub 117 +isr_no_err_stub 118 +isr_no_err_stub 119 +isr_no_err_stub 120 +isr_no_err_stub 121 +isr_no_err_stub 122 +isr_no_err_stub 123 +isr_no_err_stub 124 +isr_no_err_stub 125 +isr_no_err_stub 126 +isr_no_err_stub 127 +isr_no_err_stub 128 +isr_no_err_stub 129 +isr_no_err_stub 130 +isr_no_err_stub 131 +isr_no_err_stub 132 +isr_no_err_stub 133 +isr_no_err_stub 134 +isr_no_err_stub 135 +isr_no_err_stub 136 +isr_no_err_stub 137 +isr_no_err_stub 138 +isr_no_err_stub 139 +isr_no_err_stub 140 +isr_no_err_stub 141 +isr_no_err_stub 142 +isr_no_err_stub 143 +isr_no_err_stub 144 +isr_no_err_stub 145 +isr_no_err_stub 146 +isr_no_err_stub 147 +isr_no_err_stub 148 +isr_no_err_stub 149 +isr_no_err_stub 150 +isr_no_err_stub 151 +isr_no_err_stub 152 +isr_no_err_stub 153 +isr_no_err_stub 154 +isr_no_err_stub 155 +isr_no_err_stub 156 +isr_no_err_stub 157 +isr_no_err_stub 158 +isr_no_err_stub 159 +isr_no_err_stub 160 +isr_no_err_stub 161 +isr_no_err_stub 162 +isr_no_err_stub 163 +isr_no_err_stub 164 +isr_no_err_stub 165 +isr_no_err_stub 166 +isr_no_err_stub 167 +isr_no_err_stub 168 +isr_no_err_stub 169 +isr_no_err_stub 170 +isr_no_err_stub 171 +isr_no_err_stub 172 +isr_no_err_stub 173 +isr_no_err_stub 174 +isr_no_err_stub 175 +isr_no_err_stub 176 +isr_no_err_stub 177 +isr_no_err_stub 178 +isr_no_err_stub 179 +isr_no_err_stub 180 +isr_no_err_stub 181 +isr_no_err_stub 182 +isr_no_err_stub 183 +isr_no_err_stub 184 +isr_no_err_stub 185 +isr_no_err_stub 186 +isr_no_err_stub 187 +isr_no_err_stub 188 +isr_no_err_stub 189 +isr_no_err_stub 190 +isr_no_err_stub 191 +isr_no_err_stub 192 +isr_no_err_stub 193 +isr_no_err_stub 194 +isr_no_err_stub 195 +isr_no_err_stub 196 +isr_no_err_stub 197 +isr_no_err_stub 198 +isr_no_err_stub 199 +isr_no_err_stub 200 +isr_no_err_stub 201 +isr_no_err_stub 202 +isr_no_err_stub 203 +isr_no_err_stub 204 +isr_no_err_stub 205 +isr_no_err_stub 206 +isr_no_err_stub 207 +isr_no_err_stub 208 +isr_no_err_stub 209 +isr_no_err_stub 210 +isr_no_err_stub 211 +isr_no_err_stub 212 +isr_no_err_stub 213 +isr_no_err_stub 214 +isr_no_err_stub 215 +isr_no_err_stub 216 +isr_no_err_stub 217 +isr_no_err_stub 218 +isr_no_err_stub 219 +isr_no_err_stub 220 +isr_no_err_stub 221 +isr_no_err_stub 222 +isr_no_err_stub 223 +isr_no_err_stub 224 +isr_no_err_stub 225 +isr_no_err_stub 226 +isr_no_err_stub 227 +isr_no_err_stub 228 +isr_no_err_stub 229 +isr_no_err_stub 230 +isr_no_err_stub 231 +isr_no_err_stub 232 +isr_no_err_stub 233 +isr_no_err_stub 234 +isr_no_err_stub 235 +isr_no_err_stub 236 +isr_no_err_stub 237 +isr_no_err_stub 238 +isr_no_err_stub 239 +isr_no_err_stub 240 +isr_no_err_stub 241 +isr_no_err_stub 242 +isr_no_err_stub 243 +isr_no_err_stub 244 +isr_no_err_stub 245 +isr_no_err_stub 246 +isr_no_err_stub 247 +isr_no_err_stub 248 +isr_no_err_stub 249 +isr_no_err_stub 250 +isr_no_err_stub 251 +isr_no_err_stub 252 +isr_no_err_stub 253 +isr_no_err_stub 254 +isr_no_err_stub 255 + +global isr_stub_table +isr_stub_table: +%assign i 0 +%rep 256 + dq isr_stub_%+i ; use DQ instead if targeting 64-bit +%assign i i+1 +%endrep \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/interrupts.c b/kernel/src/sys/arch/x86_64/interrupts.c new file mode 100755 index 0000000..d243629 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/interrupts.c @@ -0,0 +1,70 @@ +//#include "mm/pmm.h" +//#include "mm/vmm.h" +#include "mm/vmm.h" +#include "sched/sched.h" +#include "sys/arch/x86_64/pic.h" +#include "sys/arch/x86_64/rtc.h" +#include "sys/log.h" +//#include "sys/sched.h" +#include +#include +#include +//#include + +int pit_millis = 0; +int pit_secs = 0; + +struct Idt_StackFrame { + struct Idt_StackFrame* rbp; + uint64_t rip; +}__attribute__((packed)); + +void dump_backtrace(registers_t *r) +{ + log("ints - backtrace : \n"); + struct Idt_StackFrame* frame = (struct Idt_StackFrame*)r->rbp; + + while (frame) { + log("ints - %s (ip: %p)\n", frame->rip); + frame = frame->rbp; + } + log("ints - \n"); +} + +void pit_handler(registers_t *regs); + +void exception_handler(registers_t *regs) { + vmm_load_pagemap(vmm_kernel_pm); + + if (regs->int_no < 32) { + //panic(kmode_cpu_exception, regs); + log("ints - %d (RIP: %p, ERR: %d)\n", regs->int_no, regs->rip, regs->err_code); + dump_backtrace(regs); + asm ("cli"); + while (1) + asm ("hlt"); + } + + if (regs->int_no == 1 + 32) + { + if (inb(0x60) & 0x80) + { + pic_ack(regs->int_no - 32); + return; + } + + log("ints - keyboard\n"); + } + else if (regs->int_no == 32 + 8) { + rtc_handle_interrupt(regs); + } + else if (regs->int_no == 0x80 - 32 || regs->int_no == 32) { + pit_handler(regs); + } + else if (regs->int_no == 0x80) + { + log("syscall - Hello World! Current process: %s", curr_proc->name); + } + //logln(info, "arch/ints", "Received interrupt %d\n", regs->int_no); + pic_ack(regs->int_no - 32); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/io.c b/kernel/src/sys/arch/x86_64/io.c new file mode 100755 index 0000000..80b1919 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/io.c @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. + +#include + +uint8_t inb(uint16_t port) { + uint8_t ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port) : "memory"); + return ret; +} + +void outb(uint16_t port, uint8_t val) { + __asm__ volatile("outb %b0, %w1" : : "a"(val), "Nd"(port) : "memory"); +} + +void io_wait(void) { outb(0x80, 0); } \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/io.h b/kernel/src/sys/arch/x86_64/io.h new file mode 100755 index 0000000..3e41421 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/io.h @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t inb(uint16_t port); +void outb(uint16_t port, uint8_t val); +void io_wait(void); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/pic.c b/kernel/src/sys/arch/x86_64/pic.c new file mode 100755 index 0000000..d36cdf9 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/pic.c @@ -0,0 +1,76 @@ +//#include "sys/log.h" +#include +//#include +#include + +void pic_init() { + //if (acpi_available) + // return; + + uint8_t a1, a2; + + a1 = inb(PIC1_DATA); + a2 = inb(PIC2_DATA); + + outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); + io_wait(); + outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); + io_wait(); + outb(PIC1_DATA, 0x20); + io_wait(); + outb(PIC2_DATA, 8); + io_wait(); + outb(PIC1_DATA, 4); + io_wait(); + outb(PIC2_DATA, 2); + io_wait(); + outb(PIC1_DATA, ICW4_8086); + io_wait(); + outb(PIC2_DATA, ICW4_8086); + io_wait(); + + outb(PIC1_DATA, a1); + outb(PIC2_DATA, a2); +} + +void pic_ack(int intno) { + if (intno >= 8) { + outb(PIC2_COMMAND, 0x20); + } + + outb(PIC1_COMMAND, 0x20); +} + +void pic_disable() // if we want APIC +{ + outb(PIC2_DATA, 0xff); + outb(PIC1_DATA, 0xff); +} + +void pic_mask_irq(uint8_t irq) { + uint16_t port; + uint8_t value; + + if (irq < 8) { + port = PIC1_DATA; + } else { + port = PIC2_DATA; + irq -= 8; + } + value = inb(port) | (1 << irq); + outb(port, value); +} + +void pic_unmask_irq(uint8_t irq) { + uint16_t port; + uint8_t value; + + if (irq < 8) { + port = PIC1_DATA; + } else { + port = PIC2_DATA; + irq -= 8; + } + value = inb(port) & ~(1 << irq); + outb(port, value); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/pic.h b/kernel/src/sys/arch/x86_64/pic.h new file mode 100755 index 0000000..8365bbc --- /dev/null +++ b/kernel/src/sys/arch/x86_64/pic.h @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. + +#pragma once + +#include + +#define PIC1_COMMAND 0x20 +#define PIC1_DATA 0x21 +#define PIC2_COMMAND 0xA0 +#define PIC2_DATA 0xA1 +#define PIC_EOI 0x20 + +#define ICW1_INIT 0x10 +#define ICW1_ICW4 0x01 +#define ICW4_8086 0x01 + +void pic_init(); +void pic_ack(int intno); +void pic_disable(); // if we want APIC +void pic_mask_irq(uint8_t irq); +void pic_unmask_irq(uint8_t irq); \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/pit.c b/kernel/src/sys/arch/x86_64/pit.c new file mode 100755 index 0000000..cadfebb --- /dev/null +++ b/kernel/src/sys/arch/x86_64/pit.c @@ -0,0 +1,60 @@ +#include "sched/sched.h" +#include "sys/arch/x86_64/idt.h" +#include "sys/arch/x86_64/pic.h" +#include +#include +#ifdef __x86_64__ + +#include +#include +//#include + +uint32_t tick = 0; + +void pit_handler(registers_t *regs) +{ + tick++; + + schedule(regs); + //Scheduler_Schedule(regs); +} + +void pit_init(uint32_t frequency) +{ + uint32_t divisor = PIT_FREQUENCY / frequency; + outb(0x43, 0x34); + outb(0x40, (uint8_t)(divisor & 0xFF)); + outb(0x40, (uint8_t)((divisor >> 8) & 0xFF)); + + pic_unmask_irq(0); +} + +void sleep(uint32_t seconds) +{ + uint32_t eticks = tick + seconds * HZ; + while (tick < eticks) + { + __asm__ __volatile__("hlt"); + } +} + +void sleep_ms(uint32_t milliseconds) +{ + uint32_t eticks = tick + (milliseconds * HZ) / 1000; + while (tick < eticks) + { + __asm__ __volatile__("hlt"); + } +} + +// todo: unistd: add usleep function +void usleep(uint32_t usecs) +{ + uint32_t eticks = tick + (usecs * HZ); + while (tick < eticks) + { + __asm__ __volatile__("hlt"); + } +} + +#endif \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/pit.h b/kernel/src/sys/arch/x86_64/pit.h new file mode 100755 index 0000000..0131be8 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/pit.h @@ -0,0 +1,17 @@ +#ifndef PIT_H +#define PIT_H + +#include +#include + +#define PIT_FREQUENCY 1193182 +#define HZ 1000 + +extern uint32_t tick; + +void pit_init(uint32_t frequency); +void sleep(uint32_t seconds); +void sleep_ms(uint32_t milliseconds); +void usleep(uint32_t usecs); + +#endif \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/rtc.c b/kernel/src/sys/arch/x86_64/rtc.c new file mode 100755 index 0000000..f66aec4 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/rtc.c @@ -0,0 +1,25 @@ +#include "sys/arch/x86_64/idt.h" +#include "sys/arch/x86_64/io.h" +#include +#include +#include + +void rtc_init() { + asm("cli"); + outb(0x70, 0x8A); + outb(0x71, 0x20); + asm("sti"); + + asm("cli"); // disable interrupts + outb(0x70, 0x8B); // select register B, and disable NMI + char prev=inb(0x71); // read the current value of register B + outb(0x70, 0x8B); // set the index again (a read will reset the index to register D) + outb(0x71, prev | 0x40); // write the previous value ORed with 0x40. This turns on bit 6 of register B + asm("sti"); + + //pic_unmask_irq(8); +} + +void rtc_handle_interrupt(registers_t *regs) { + printf("RTC!\n"); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/rtc.h b/kernel/src/sys/arch/x86_64/rtc.h new file mode 100755 index 0000000..a81996d --- /dev/null +++ b/kernel/src/sys/arch/x86_64/rtc.h @@ -0,0 +1,6 @@ +#pragma once + +#include "sys/arch/x86_64/idt.h" + +void rtc_init(); +void rtc_handle_interrupt(registers_t *regs); \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/sse.c b/kernel/src/sys/arch/x86_64/sse.c new file mode 100755 index 0000000..570d903 --- /dev/null +++ b/kernel/src/sys/arch/x86_64/sse.c @@ -0,0 +1,59 @@ +#include +#include +#include + +int cpuid_check_bit(int reg, int bit) { + int eax, ebx, ecx, edx; + + // Minimal inline assembly to execute CPUID + __asm__ volatile ( + "cpuid" // Execute CPUID instruction + : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) // Output registers + : "a"(0x1) // Input: EAX = 0x1 (query feature flags) + : // No clobbered registers + ); + + // Check bit 25 of EDX (SSE support) in plain C + if (reg == 0) { + if (edx & (1 << bit)) { + return 1; // SSE is supported + } else { + return 0; // SSE is not supported + } + }else if (reg == 1) { + if (ecx & (1 << bit)) { + return 1; // SSE is supported + } else { + return 0; // SSE is not supported + } + } + + return 0; +} + +void sse_init() { + int sse = cpuid_check_bit(0, 25); + int sse2 = cpuid_check_bit(0, 26); + int sse3 = cpuid_check_bit(1, 0); + int ssse3 = cpuid_check_bit(1, 9); + + if (sse) + log("sse - sse is supported!\n"); + else + log("sse - sse isn't supported!\n"); + + if (sse2) + log("sse - sse2 is supported!\n"); + else + log("sse - sse2 isn't supported!\n"); + + if (sse3) + log("sse - sse3 is supported!\n"); + else + log("sse - sse3 isn't supported!\n"); + + if (ssse3) + log("sse - ssse3 is supported!\n"); + else + log("sse - ssse3 isn't supported!\n"); +} \ No newline at end of file diff --git a/kernel/src/sys/arch/x86_64/sse.h b/kernel/src/sys/arch/x86_64/sse.h new file mode 100755 index 0000000..b4500fa --- /dev/null +++ b/kernel/src/sys/arch/x86_64/sse.h @@ -0,0 +1,4 @@ +#pragma once + +int sse_is_supported(); +void sse_init(); \ No newline at end of file diff --git a/kernel/src/sys/log.c b/kernel/src/sys/log.c new file mode 100755 index 0000000..e234483 --- /dev/null +++ b/kernel/src/sys/log.c @@ -0,0 +1,32 @@ +#include "rt.h" +#include "sys/arch/x86_64/io.h" +#include +#include + +void log(char *format, ...) { + // TODO: replace this call with a call to printf() when the RTC is implemented. + rt_print("1970-01-01 00:00:00 | "); + + char buf[2048]; + va_list l; + va_start(l, format); + npf_vsnprintf(buf, 2048, format, l); + va_end(l); + + rt_print(buf); + + char *date = "1970-01-01 00:00:00 | "; + for (int i;;i++) { + if (date[i] == '\0') + break; + + outb(0xE9, date[i]); + } + + for (int i;;i++) { + if (buf[i] == '\0') + break; + + outb(0xE9, buf[i]); + } +} \ No newline at end of file diff --git a/kernel/src/sys/log.h b/kernel/src/sys/log.h new file mode 100755 index 0000000..1d9545f --- /dev/null +++ b/kernel/src/sys/log.h @@ -0,0 +1,3 @@ +#pragma once + +void log(char *format, ...); \ No newline at end of file diff --git a/kernel/src/sys/printf.c b/kernel/src/sys/printf.c new file mode 100755 index 0000000..603ab63 --- /dev/null +++ b/kernel/src/sys/printf.c @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Sipaa Projects +// This code is part of the Soaplin kernel and is licensed under the terms of +// the MIT License. +#include +#include + +#define NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS 0 +#define NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS 0 + +// Compile nanoprintf in this translation unit. +#define NANOPRINTF_IMPLEMENTATION +#include + +void printf(char *format, ...) { + char buf[2048]; + va_list lst; + va_start(lst, format); + npf_vsnprintf(buf, 2048, format, lst); + va_end(lst); + + rt_print(buf); +} \ No newline at end of file diff --git a/kernel/src/sys/printf.h b/kernel/src/sys/printf.h new file mode 100755 index 0000000..759e840 --- /dev/null +++ b/kernel/src/sys/printf.h @@ -0,0 +1,1320 @@ +/* nanoprintf v0.5.3: a tiny embeddable printf replacement written in C. + https://github.com/charlesnicholson/nanoprintf + charles.nicholson+nanoprintf@gmail.com + dual-licensed under 0bsd and unlicense, take your pick. see eof for details. + */ + +#ifndef NANOPRINTF_H_INCLUDED +#define NANOPRINTF_H_INCLUDED + +#include +#include + +// Define this to fully sandbox nanoprintf inside of a translation unit. +#ifdef NANOPRINTF_VISIBILITY_STATIC +#define NPF_VISIBILITY static +#else +#define NPF_VISIBILITY extern +#endif + +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +#define NPF_PRINTF_ATTR(FORMAT_INDEX, VARGS_INDEX) \ + __attribute__((format(printf, FORMAT_INDEX, VARGS_INDEX))) +#else +#define NPF_PRINTF_ATTR(FORMAT_INDEX, VARGS_INDEX) +#endif + +// Public API + +#ifdef __cplusplus +extern "C" { +#endif + +// The npf_ functions all return the number of bytes required to express the +// fully-formatted string, not including the null terminator character. +// The npf_ functions do not return negative values, since the lack of 'l' +// length modifier support makes encoding errors impossible. + +NPF_VISIBILITY int npf_snprintf(char *buffer, size_t bufsz, const char *format, + ...) NPF_PRINTF_ATTR(3, 4); + +NPF_VISIBILITY int npf_vsnprintf(char *buffer, size_t bufsz, char const *format, + va_list vlist) NPF_PRINTF_ATTR(3, 0); + +typedef void (*npf_putc)(int c, void *ctx); +NPF_VISIBILITY int npf_pprintf(npf_putc pc, void *pc_ctx, char const *format, + ...) NPF_PRINTF_ATTR(3, 4); + +NPF_VISIBILITY int npf_vpprintf(npf_putc pc, void *pc_ctx, char const *format, + va_list vlist) NPF_PRINTF_ATTR(3, 0); + +#ifdef __cplusplus +} +#endif + +#endif // NANOPRINTF_H_INCLUDED + +/* The implementation of nanoprintf begins here, to be compiled only if + NANOPRINTF_IMPLEMENTATION is defined. In a multi-file library what follows + would be nanoprintf.c. */ + +#ifdef NANOPRINTF_IMPLEMENTATION + +#ifndef NANOPRINTF_IMPLEMENTATION_INCLUDED +#define NANOPRINTF_IMPLEMENTATION_INCLUDED + +#include +#include + +// The conversion buffer must fit at least UINT64_MAX in octal format with the +// leading '0'. +#ifndef NANOPRINTF_CONVERSION_BUFFER_SIZE +#define NANOPRINTF_CONVERSION_BUFFER_SIZE 23 +#endif +#if NANOPRINTF_CONVERSION_BUFFER_SIZE < 23 +#error The size of the conversion buffer must be at least 23 bytes. +#endif + +// Pick reasonable defaults if nothing's been configured. +#if !defined(NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS) && \ + !defined(NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS) && \ + !defined(NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS) && \ + !defined(NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS) && \ + !defined(NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS) && \ + !defined(NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS) +#define NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS 1 +#define NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS 0 +#define NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS 0 +#define NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS 0 +#endif + +// If anything's been configured, everything must be configured. +#ifndef NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif +#ifndef NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif +#ifndef NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif +#ifndef NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif +#ifndef NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif +#ifndef NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS +#error NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS must be #defined to 0 or 1 +#endif + +// Ensure flags are compatible. +#if (NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1) && \ + (NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 0) +#error Precision format specifiers must be enabled if float support is enabled. +#endif + +// intmax_t / uintmax_t require stdint from c99 / c++11 +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 +#ifndef _MSC_VER +#ifdef __cplusplus +#if __cplusplus < 201103L +#error large format specifier support requires C++11 or later. +#endif +#else +#if __STDC_VERSION__ < 199409L +#error nanoprintf requires C99 or later. +#endif +#endif +#endif +#endif + +// Figure out if we can disable warnings with pragmas. +#ifdef __clang__ +#define NANOPRINTF_CLANG 1 +#define NANOPRINTF_GCC_PAST_4_6 0 +#else +#define NANOPRINTF_CLANG 0 +#if defined(__GNUC__) && \ + ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6))) +#define NANOPRINTF_GCC_PAST_4_6 1 +#else +#define NANOPRINTF_GCC_PAST_4_6 0 +#endif +#endif + +#if NANOPRINTF_CLANG || NANOPRINTF_GCC_PAST_4_6 +#define NANOPRINTF_HAVE_GCC_WARNING_PRAGMAS 1 +#else +#define NANOPRINTF_HAVE_GCC_WARNING_PRAGMAS 0 +#endif + +#if NANOPRINTF_HAVE_GCC_WARNING_PRAGMAS +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#ifdef __cplusplus +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#pragma GCC diagnostic ignored "-Wpadded" +#pragma GCC diagnostic ignored "-Wfloat-equal" +#if NANOPRINTF_CLANG +#pragma GCC diagnostic ignored "-Wc++98-compat-pedantic" +#pragma GCC diagnostic ignored "-Wcovered-switch-default" +#pragma GCC diagnostic ignored "-Wdeclaration-after-statement" +#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +#ifndef __APPLE__ +#pragma GCC diagnostic ignored "-Wunsafe-buffer-usage" +#endif +#elif NANOPRINTF_GCC_PAST_4_6 +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4619) // there is no warning number 'number' +// C4619 has to be disabled first! +#pragma warning(disable : 4127) // conditional expression is constant +#pragma warning(disable : 4505) // unreferenced local function has been removed +#pragma warning(disable : 4514) // unreferenced inline function has been removed +#pragma warning(disable : 4701) // potentially uninitialized local variable used +#pragma warning(disable : 4706) // assignment within conditional expression +#pragma warning(disable : 4710) // function not inlined +#pragma warning(disable : 4711) // function selected for inline expansion +#pragma warning(disable : 4820) // padding added after struct member +#pragma warning(disable : 5039) // potentially throwing function passed to + // extern C function +#pragma warning(disable : 5045) // compiler will insert Spectre mitigation for + // memory load +#pragma warning(disable : 5262) // implicit switch fall-through +#pragma warning(disable : 26812) // enum type is unscoped +#endif + +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +#define NPF_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) +#define NPF_NOINLINE __declspec(noinline) +#else +#define NPF_NOINLINE +#endif + +#if (NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1) || \ + (NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1) +enum { + NPF_FMT_SPEC_OPT_NONE, + NPF_FMT_SPEC_OPT_LITERAL, + NPF_FMT_SPEC_OPT_STAR, +}; +#endif + +enum { + NPF_FMT_SPEC_LEN_MOD_NONE, + NPF_FMT_SPEC_LEN_MOD_SHORT, // 'h' + NPF_FMT_SPEC_LEN_MOD_LONG_DOUBLE, // 'L' + NPF_FMT_SPEC_LEN_MOD_CHAR, // 'hh' + NPF_FMT_SPEC_LEN_MOD_LONG, // 'l' +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + NPF_FMT_SPEC_LEN_MOD_LARGE_LONG_LONG, // 'll' + NPF_FMT_SPEC_LEN_MOD_LARGE_INTMAX, // 'j' + NPF_FMT_SPEC_LEN_MOD_LARGE_SIZET, // 'z' + NPF_FMT_SPEC_LEN_MOD_LARGE_PTRDIFFT, // 't' +#endif +}; + +enum { + NPF_FMT_SPEC_CONV_NONE, + NPF_FMT_SPEC_CONV_PERCENT, // '%' + NPF_FMT_SPEC_CONV_CHAR, // 'c' + NPF_FMT_SPEC_CONV_STRING, // 's' + NPF_FMT_SPEC_CONV_SIGNED_INT, // 'i', 'd' +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + NPF_FMT_SPEC_CONV_BINARY, // 'b' +#endif + NPF_FMT_SPEC_CONV_OCTAL, // 'o' + NPF_FMT_SPEC_CONV_HEX_INT, // 'x', 'X' + NPF_FMT_SPEC_CONV_UNSIGNED_INT, // 'u' + NPF_FMT_SPEC_CONV_POINTER, // 'p' +#if NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS == 1 + NPF_FMT_SPEC_CONV_WRITEBACK, // 'n' +#endif +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + NPF_FMT_SPEC_CONV_FLOAT_DEC, // 'f', 'F' + NPF_FMT_SPEC_CONV_FLOAT_SCI, // 'e', 'E' + NPF_FMT_SPEC_CONV_FLOAT_SHORTEST, // 'g', 'G' + NPF_FMT_SPEC_CONV_FLOAT_HEX, // 'a', 'A' +#endif +}; + +typedef struct npf_format_spec { +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + int field_width; + uint8_t field_width_opt; + char left_justified; // '-' + char leading_zero_pad; // '0' +#endif +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + int prec; + uint8_t prec_opt; +#endif + char prepend; // ' ' or '+' + char alt_form; // '#' + char case_adjust; // 'a' - 'A' + uint8_t length_modifier; + uint8_t conv_spec; +} npf_format_spec_t; + +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 0 +typedef long npf_int_t; +typedef unsigned long npf_uint_t; +#else +typedef intmax_t npf_int_t; +typedef uintmax_t npf_uint_t; +#endif + +typedef struct npf_bufputc_ctx { + char *dst; + size_t len; + size_t cur; +} npf_bufputc_ctx_t; + +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 +typedef char + npf_size_is_ptrdiff[(sizeof(size_t) == sizeof(ptrdiff_t)) ? 1 : -1]; +typedef ptrdiff_t npf_ssize_t; +#endif + +#ifdef _MSC_VER +#include +#endif + +static int npf_max(int x, int y) { return (x > y) ? x : y; } + +static int npf_parse_format_spec(char const *format, + npf_format_spec_t *out_spec) { + char const *cur = format; + +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + out_spec->left_justified = 0; + out_spec->leading_zero_pad = 0; +#endif + out_spec->case_adjust = 'a' - 'A'; // lowercase + out_spec->prepend = 0; + out_spec->alt_form = 0; + + while (*++cur) { // cur points at the leading '%' character + switch (*cur) { // Optional flags +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + case '-': + out_spec->left_justified = '-'; + out_spec->leading_zero_pad = 0; + continue; + case '0': + out_spec->leading_zero_pad = !out_spec->left_justified; + continue; +#endif + case '+': + out_spec->prepend = '+'; + continue; + case ' ': + if (out_spec->prepend == 0) { + out_spec->prepend = ' '; + } + continue; + case '#': + out_spec->alt_form = '#'; + continue; + default: + break; + } + break; + } + +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + out_spec->field_width_opt = NPF_FMT_SPEC_OPT_NONE; + if (*cur == '*') { + out_spec->field_width_opt = NPF_FMT_SPEC_OPT_STAR; + ++cur; + } else { + out_spec->field_width = 0; + while ((*cur >= '0') && (*cur <= '9')) { + out_spec->field_width_opt = NPF_FMT_SPEC_OPT_LITERAL; + out_spec->field_width = (out_spec->field_width * 10) + (*cur++ - '0'); + } + } +#endif + +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + out_spec->prec = 0; + out_spec->prec_opt = NPF_FMT_SPEC_OPT_NONE; + if (*cur == '.') { + ++cur; + if (*cur == '*') { + out_spec->prec_opt = NPF_FMT_SPEC_OPT_STAR; + ++cur; + } else { + if (*cur == '-') { + ++cur; + } else { + out_spec->prec_opt = NPF_FMT_SPEC_OPT_LITERAL; + } + while ((*cur >= '0') && (*cur <= '9')) { + out_spec->prec = (out_spec->prec * 10) + (*cur++ - '0'); + } + } + } +#endif + + uint_fast8_t tmp_conv = NPF_FMT_SPEC_CONV_NONE; + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_NONE; + switch (*cur++) { // Length modifier + case 'h': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_SHORT; + if (*cur == 'h') { + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_CHAR; + ++cur; + } + break; + case 'l': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LONG; +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + if (*cur == 'l') { + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LARGE_LONG_LONG; + ++cur; + } +#endif + break; +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + case 'L': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LONG_DOUBLE; + break; +#endif +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + case 'j': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LARGE_INTMAX; + break; + case 'z': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LARGE_SIZET; + break; + case 't': + out_spec->length_modifier = NPF_FMT_SPEC_LEN_MOD_LARGE_PTRDIFFT; + break; +#endif + default: + --cur; + break; + } + + switch (*cur++) { // Conversion specifier + case '%': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_PERCENT; +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + out_spec->prec_opt = NPF_FMT_SPEC_OPT_NONE; +#endif + break; + + case 'c': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_CHAR; +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + out_spec->prec_opt = NPF_FMT_SPEC_OPT_NONE; +#endif + break; + + case 's': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_STRING; +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + out_spec->leading_zero_pad = 0; +#endif + break; + + case 'i': + case 'd': + tmp_conv = NPF_FMT_SPEC_CONV_SIGNED_INT; + case 'o': + if (tmp_conv == NPF_FMT_SPEC_CONV_NONE) { + tmp_conv = NPF_FMT_SPEC_CONV_OCTAL; + } + case 'u': + if (tmp_conv == NPF_FMT_SPEC_CONV_NONE) { + tmp_conv = NPF_FMT_SPEC_CONV_UNSIGNED_INT; + } + case 'X': + if (tmp_conv == NPF_FMT_SPEC_CONV_NONE) { + out_spec->case_adjust = 0; + } + case 'x': + if (tmp_conv == NPF_FMT_SPEC_CONV_NONE) { + tmp_conv = NPF_FMT_SPEC_CONV_HEX_INT; + } + out_spec->conv_spec = (uint8_t)tmp_conv; +#if (NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1) && \ + (NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1) + if (out_spec->prec_opt != NPF_FMT_SPEC_OPT_NONE) { + out_spec->leading_zero_pad = 0; + } +#endif + break; + +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + case 'F': + out_spec->case_adjust = 0; + case 'f': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_FLOAT_DEC; + if (out_spec->prec_opt == NPF_FMT_SPEC_OPT_NONE) { + out_spec->prec = 6; + } + break; + + case 'E': + out_spec->case_adjust = 0; + case 'e': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_FLOAT_SCI; + if (out_spec->prec_opt == NPF_FMT_SPEC_OPT_NONE) { + out_spec->prec = 6; + } + break; + + case 'G': + out_spec->case_adjust = 0; + case 'g': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_FLOAT_SHORTEST; + if (out_spec->prec_opt == NPF_FMT_SPEC_OPT_NONE) { + out_spec->prec = 6; + } + break; + + case 'A': + out_spec->case_adjust = 0; + case 'a': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_FLOAT_HEX; + if (out_spec->prec_opt == NPF_FMT_SPEC_OPT_NONE) { + out_spec->prec = 6; + } + break; +#endif + +#if NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS == 1 + case 'n': + // todo: reject string if flags or width or precision exist + out_spec->conv_spec = NPF_FMT_SPEC_CONV_WRITEBACK; +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + out_spec->prec_opt = NPF_FMT_SPEC_OPT_NONE; +#endif + break; +#endif + + case 'p': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_POINTER; +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + out_spec->prec_opt = NPF_FMT_SPEC_OPT_NONE; +#endif + break; + +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + case 'B': + out_spec->case_adjust = 0; + case 'b': + out_spec->conv_spec = NPF_FMT_SPEC_CONV_BINARY; + break; +#endif + + default: + return 0; + } + + return (int)(cur - format); +} + +static NPF_NOINLINE int npf_utoa_rev(npf_uint_t val, char *buf, + uint_fast8_t base, char case_adj) { + uint_fast8_t n = 0; + do { + int_fast8_t const d = (int_fast8_t)(val % base); + *buf++ = (char)(((d < 10) ? '0' : ('A' - 10 + case_adj)) + d); + ++n; + val /= base; + } while (val); + return (int)n; +} + +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + +#include + +#if (DBL_MANT_DIG <= 11) && (DBL_MAX_EXP <= 16) +typedef uint_fast16_t npf_double_bin_t; +typedef int_fast8_t npf_ftoa_exp_t; +#elif (DBL_MANT_DIG <= 24) && (DBL_MAX_EXP <= 128) +typedef uint_fast32_t npf_double_bin_t; +typedef int_fast8_t npf_ftoa_exp_t; +#elif (DBL_MANT_DIG <= 53) && (DBL_MAX_EXP <= 1024) +typedef uint_fast64_t npf_double_bin_t; +typedef int_fast16_t npf_ftoa_exp_t; +#else +#error Unsupported width of the double type. +#endif + +// The floating point conversion code works with an unsigned integer type of any +// size. +#ifndef NANOPRINTF_CONVERSION_FLOAT_TYPE +#define NANOPRINTF_CONVERSION_FLOAT_TYPE unsigned int +#endif +typedef NANOPRINTF_CONVERSION_FLOAT_TYPE npf_ftoa_man_t; + +#if (NANOPRINTF_CONVERSION_BUFFER_SIZE <= UINT_FAST8_MAX) && \ + (UINT_FAST8_MAX <= INT_MAX) +typedef uint_fast8_t npf_ftoa_dec_t; +#else +typedef int npf_ftoa_dec_t; +#endif + +enum { + NPF_DOUBLE_EXP_MASK = DBL_MAX_EXP * 2 - 1, + NPF_DOUBLE_EXP_BIAS = DBL_MAX_EXP - 1, + NPF_DOUBLE_MAN_BITS = DBL_MANT_DIG - 1, + NPF_DOUBLE_BIN_BITS = sizeof(npf_double_bin_t) * CHAR_BIT, + NPF_FTOA_MAN_BITS = sizeof(npf_ftoa_man_t) * CHAR_BIT, + NPF_FTOA_SHIFT_BITS = + ((NPF_FTOA_MAN_BITS < DBL_MANT_DIG) ? NPF_FTOA_MAN_BITS : DBL_MANT_DIG) - + 1 +}; + +/* Generally, floating-point conversion implementations use + grisu2 (https://bit.ly/2JgMggX) and ryu (https://bit.ly/2RLXSg0) algorithms, + which are mathematically exact and fast, but require large lookup tables. + + This implementation was inspired by Wojciech Muła's (zdjęcia@garnek.pl) + algorithm (http://0x80.pl/notesen/2015-12-29-float-to-string.html) and + extended further by adding dynamic scaling and configurable integer width by + Oskars Rubenis (https://github.com/Okarss). */ + +static int npf_ftoa_rev(char *buf, npf_format_spec_t const *spec, double f) { + char const *ret = NULL; + npf_double_bin_t bin; + { // Union-cast is UB pre-C11, compiler optimizes byte-copy loop. + char const *src = (char const *)&f; + char *dst = (char *)&bin; + for (uint_fast8_t i = 0; i < sizeof(f); ++i) { + dst[i] = src[i]; + } + } + + // Unsigned -> signed int casting is IB and can raise a signal but generally + // doesn't. + npf_ftoa_exp_t exp = + (npf_ftoa_exp_t)((npf_ftoa_exp_t)(bin >> NPF_DOUBLE_MAN_BITS) & + NPF_DOUBLE_EXP_MASK); + + bin &= ((npf_double_bin_t)0x1 << NPF_DOUBLE_MAN_BITS) - 1; + if (exp == (npf_ftoa_exp_t)NPF_DOUBLE_EXP_MASK) { // special value + ret = (bin) ? "NAN" : "FNI"; + goto exit; + } + if (spec->prec > (NANOPRINTF_CONVERSION_BUFFER_SIZE - 2)) { + goto exit; + } + if (exp) { // normal number + bin |= (npf_double_bin_t)0x1 << NPF_DOUBLE_MAN_BITS; + } else { // subnormal number + ++exp; + } + exp = (npf_ftoa_exp_t)(exp - NPF_DOUBLE_EXP_BIAS); + + uint_fast8_t carry; + carry = 0; + npf_ftoa_dec_t end, dec; + dec = (npf_ftoa_dec_t)spec->prec; + if (dec || spec->alt_form) { + buf[dec++] = '.'; + } + + { // Integer part + npf_ftoa_man_t man_i; + + if (exp >= 0) { + int_fast8_t shift_i = + (int_fast8_t)((exp > NPF_FTOA_SHIFT_BITS) ? (int)NPF_FTOA_SHIFT_BITS + : exp); + npf_ftoa_exp_t exp_i = (npf_ftoa_exp_t)(exp - shift_i); + shift_i = (int_fast8_t)(NPF_DOUBLE_MAN_BITS - shift_i); + man_i = (npf_ftoa_man_t)(bin >> shift_i); + + if (exp_i) { + if (shift_i) { + carry = (bin >> (shift_i - 1)) & 0x1; + } + exp = NPF_DOUBLE_MAN_BITS; // invalidate the fraction part + } + + // Scale the exponent from base-2 to base-10. + for (; exp_i; --exp_i) { + if (!(man_i & ((npf_ftoa_man_t)0x1 << (NPF_FTOA_MAN_BITS - 1)))) { + man_i = (npf_ftoa_man_t)(man_i << 1); + man_i = (npf_ftoa_man_t)(man_i | carry); + carry = 0; + } else { + if (dec >= NANOPRINTF_CONVERSION_BUFFER_SIZE) { + goto exit; + } + buf[dec++] = '0'; + carry = (((uint_fast8_t)(man_i % 5) + carry) > 2); + man_i /= 5; + } + } + } else { + man_i = 0; + } + end = dec; + + do { // Print the integer + if (end >= NANOPRINTF_CONVERSION_BUFFER_SIZE) { + goto exit; + } + buf[end++] = (char)('0' + (char)(man_i % 10)); + man_i /= 10; + } while (man_i); + } + + { // Fraction part + npf_ftoa_man_t man_f; + npf_ftoa_dec_t dec_f = (npf_ftoa_dec_t)spec->prec; + + if (exp < NPF_DOUBLE_MAN_BITS) { + int_fast8_t shift_f = (int_fast8_t)((exp < 0) ? -1 : exp); + npf_ftoa_exp_t exp_f = (npf_ftoa_exp_t)(exp - shift_f); + npf_double_bin_t bin_f = + bin << ((NPF_DOUBLE_BIN_BITS - NPF_DOUBLE_MAN_BITS) + shift_f); + + // This if-else statement can be completely optimized at compile time. + if (NPF_DOUBLE_BIN_BITS > NPF_FTOA_MAN_BITS) { + man_f = (npf_ftoa_man_t)(bin_f >> ((unsigned)(NPF_DOUBLE_BIN_BITS - + NPF_FTOA_MAN_BITS) % + NPF_DOUBLE_BIN_BITS)); + carry = (uint_fast8_t)((bin_f >> ((unsigned)(NPF_DOUBLE_BIN_BITS - + NPF_FTOA_MAN_BITS - 1) % + NPF_DOUBLE_BIN_BITS)) & + 0x1); + } else { + man_f = (npf_ftoa_man_t)((npf_ftoa_man_t)bin_f + << ((unsigned)(NPF_FTOA_MAN_BITS - + NPF_DOUBLE_BIN_BITS) % + NPF_FTOA_MAN_BITS)); + carry = 0; + } + + // Scale the exponent from base-2 to base-10 and prepare the first digit. + for (uint_fast8_t digit = 0; dec_f && (exp_f < 4); ++exp_f) { + if ((man_f > ((npf_ftoa_man_t)-4 / 5)) || digit) { + carry = (uint_fast8_t)(man_f & 0x1); + man_f = (npf_ftoa_man_t)(man_f >> 1); + } else { + man_f = (npf_ftoa_man_t)(man_f * 5); + if (carry) { + man_f = (npf_ftoa_man_t)(man_f + 3); + carry = 0; + } + if (exp_f < 0) { + buf[--dec_f] = '0'; + } else { + ++digit; + } + } + } + man_f = (npf_ftoa_man_t)(man_f + carry); + carry = (exp_f >= 0); + dec = 0; + } else { + man_f = 0; + } + + if (dec_f) { + // Print the fraction + for (;;) { + buf[--dec_f] = (char)('0' + (char)(man_f >> (NPF_FTOA_MAN_BITS - 4))); + man_f = (npf_ftoa_man_t)(man_f & ~((npf_ftoa_man_t)0xF + << (NPF_FTOA_MAN_BITS - 4))); + if (!dec_f) { + break; + } + man_f = (npf_ftoa_man_t)(man_f * 10); + } + man_f = (npf_ftoa_man_t)(man_f << 4); + } + if (exp < NPF_DOUBLE_MAN_BITS) { + carry &= (uint_fast8_t)(man_f >> (NPF_FTOA_MAN_BITS - 1)); + } + } + + // Round the number + for (; carry; ++dec) { + if (dec >= NANOPRINTF_CONVERSION_BUFFER_SIZE) { + goto exit; + } + if (dec >= end) { + buf[end++] = '0'; + } + if (buf[dec] == '.') { + continue; + } + carry = (buf[dec] == '9'); + buf[dec] = (char)(carry ? '0' : (buf[dec] + 1)); + } + + return (int)end; +exit: + if (!ret) { + ret = "RRE"; + } + uint_fast8_t i; + for (i = 0; ret[i]; ++i) { + buf[i] = (char)(ret[i] + spec->case_adjust); + } + return (int)i; +} + +#endif // NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS + +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 +static int npf_bin_len(npf_uint_t u) { + // Return the length of the binary string format of 'u', preferring + // intrinsics. + if (!u) { + return 1; + } + +#ifdef _MSC_VER // Win64, use _BSR64 for everything. If x86, use _BSR when + // non-large. +#ifdef _M_X64 +#define NPF_HAVE_BUILTIN_CLZ +#define NPF_CLZ _BitScanReverse64 +#elif NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 0 +#define NPF_HAVE_BUILTIN_CLZ +#define NPF_CLZ _BitScanReverse +#endif +#ifdef NPF_HAVE_BUILTIN_CLZ + unsigned long idx; + NPF_CLZ(&idx, u); + return (int)(idx + 1); +#endif +#elif NANOPRINTF_CLANG || NANOPRINTF_GCC_PAST_4_6 +#define NPF_HAVE_BUILTIN_CLZ +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 +#define NPF_CLZ(X) ((sizeof(long long) * CHAR_BIT) - (size_t)__builtin_clzll(X)) +#else +#define NPF_CLZ(X) ((sizeof(long) * CHAR_BIT) - (size_t)__builtin_clzl(X)) +#endif + return (int)NPF_CLZ(u); +#endif + +#ifndef NPF_HAVE_BUILTIN_CLZ + int n; + for (n = 0; u; ++n, u >>= 1) + ; // slow but small software fallback + return n; +#else +#undef NPF_HAVE_BUILTIN_CLZ +#undef NPF_CLZ +#endif +} +#endif + +static void npf_bufputc(int c, void *ctx) { + npf_bufputc_ctx_t *bpc = (npf_bufputc_ctx_t *)ctx; + if (bpc->cur < bpc->len) { + bpc->dst[bpc->cur++] = (char)c; + } +} + +static void npf_bufputc_nop(int c, void *ctx) { + (void)c; + (void)ctx; +} + +typedef struct npf_cnt_putc_ctx { + npf_putc pc; + void *ctx; + int n; +} npf_cnt_putc_ctx_t; + +static void npf_putc_cnt(int c, void *ctx) { + npf_cnt_putc_ctx_t *pc_cnt = (npf_cnt_putc_ctx_t *)ctx; + ++pc_cnt->n; + pc_cnt->pc(c, pc_cnt->ctx); // sibling-call optimization +} + +#define NPF_PUTC(VAL) \ + do { \ + npf_putc_cnt((int)(VAL), &pc_cnt); \ + } while (0) + +#define NPF_EXTRACT(MOD, CAST_TO, EXTRACT_AS) \ + case NPF_FMT_SPEC_LEN_MOD_##MOD: \ + val = (CAST_TO)va_arg(args, EXTRACT_AS); \ + break + +#define NPF_WRITEBACK(MOD, TYPE) \ + case NPF_FMT_SPEC_LEN_MOD_##MOD: \ + *(va_arg(args, TYPE *)) = (TYPE)pc_cnt.n; \ + break + +int npf_vpprintf(npf_putc pc, void *pc_ctx, char const *format, va_list args) { + npf_format_spec_t fs; + char const *cur = format; + npf_cnt_putc_ctx_t pc_cnt; + pc_cnt.pc = pc; + pc_cnt.ctx = pc_ctx; + pc_cnt.n = 0; + + while (*cur) { + int const fs_len = (*cur != '%') ? 0 : npf_parse_format_spec(cur, &fs); + if (!fs_len) { + NPF_PUTC(*cur++); + continue; + } + cur += fs_len; + + // Extract star-args immediately +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + if (fs.field_width_opt == NPF_FMT_SPEC_OPT_STAR) { + fs.field_width = va_arg(args, int); + if (fs.field_width < 0) { + fs.field_width = -fs.field_width; + fs.left_justified = 1; + } + } +#endif +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + if (fs.prec_opt == NPF_FMT_SPEC_OPT_STAR) { + fs.prec = va_arg(args, int); + if (fs.prec < 0) { + fs.prec_opt = NPF_FMT_SPEC_OPT_NONE; + } + } +#endif + + union { + char cbuf_mem[NANOPRINTF_CONVERSION_BUFFER_SIZE]; + npf_uint_t binval; + } u; + char *cbuf = u.cbuf_mem, sign_c = 0; + int cbuf_len = 0, need_0x = 0; +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + int field_pad = 0; + char pad_c = 0; +#endif +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + int prec_pad = 0; +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + int zero = 0; +#endif +#endif + + // Extract and convert the argument to string, point cbuf at the text. + switch (fs.conv_spec) { + case NPF_FMT_SPEC_CONV_PERCENT: + *cbuf = '%'; + cbuf_len = 1; + break; + + case NPF_FMT_SPEC_CONV_CHAR: + *cbuf = (char)va_arg(args, int); + cbuf_len = 1; + break; + + case NPF_FMT_SPEC_CONV_STRING: { + cbuf = va_arg(args, char *); +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + for (char const *s = cbuf; + ((fs.prec_opt == NPF_FMT_SPEC_OPT_NONE) || (cbuf_len < fs.prec)) && + *s; + ++s, ++cbuf_len) + ; +#else + for (char const *s = cbuf; *s; ++s, ++cbuf_len) + ; // strlen +#endif + } break; + + case NPF_FMT_SPEC_CONV_SIGNED_INT: { + npf_int_t val = 0; + switch (fs.length_modifier) { + NPF_EXTRACT(NONE, int, int); + NPF_EXTRACT(SHORT, short, int); + NPF_EXTRACT(LONG_DOUBLE, int, int); + NPF_EXTRACT(CHAR, char, int); + NPF_EXTRACT(LONG, long, long); +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + NPF_EXTRACT(LARGE_LONG_LONG, long long, long long); + NPF_EXTRACT(LARGE_INTMAX, intmax_t, intmax_t); + NPF_EXTRACT(LARGE_SIZET, npf_ssize_t, npf_ssize_t); + NPF_EXTRACT(LARGE_PTRDIFFT, ptrdiff_t, ptrdiff_t); +#endif + default: + break; + } + + sign_c = (val < 0) ? '-' : fs.prepend; + +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + zero = !val; +#endif + // special case, if prec and value are 0, skip + if (!val && (fs.prec_opt != NPF_FMT_SPEC_OPT_NONE) && !fs.prec) { + cbuf_len = 0; + } else +#endif + { + npf_uint_t uval = (npf_uint_t)val; + if (val < 0) { + uval = 0 - uval; + } + cbuf_len = npf_utoa_rev(uval, cbuf, 10, fs.case_adjust); + } + } break; + +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + case NPF_FMT_SPEC_CONV_BINARY: +#endif + case NPF_FMT_SPEC_CONV_OCTAL: + case NPF_FMT_SPEC_CONV_HEX_INT: + case NPF_FMT_SPEC_CONV_UNSIGNED_INT: { + npf_uint_t val = 0; + + switch (fs.length_modifier) { + NPF_EXTRACT(NONE, unsigned, unsigned); + NPF_EXTRACT(SHORT, unsigned short, unsigned); + NPF_EXTRACT(LONG_DOUBLE, unsigned, unsigned); + NPF_EXTRACT(CHAR, unsigned char, unsigned); + NPF_EXTRACT(LONG, unsigned long, unsigned long); +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + NPF_EXTRACT(LARGE_LONG_LONG, unsigned long long, unsigned long long); + NPF_EXTRACT(LARGE_INTMAX, uintmax_t, uintmax_t); + NPF_EXTRACT(LARGE_SIZET, size_t, size_t); + NPF_EXTRACT(LARGE_PTRDIFFT, size_t, size_t); +#endif + default: + break; + } + +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + zero = !val; +#endif + if (!val && (fs.prec_opt != NPF_FMT_SPEC_OPT_NONE) && !fs.prec) { + // Zero value and explicitly-requested zero precision means "print + // nothing". + if ((fs.conv_spec == NPF_FMT_SPEC_CONV_OCTAL) && fs.alt_form) { + fs.prec = 1; // octal special case, print a single '0' + } + } else +#endif +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + if (fs.conv_spec == NPF_FMT_SPEC_CONV_BINARY) { + cbuf_len = npf_bin_len(val); + u.binval = val; + } else +#endif + { + uint_fast8_t const base = + (fs.conv_spec == NPF_FMT_SPEC_CONV_OCTAL) + ? 8u + : ((fs.conv_spec == NPF_FMT_SPEC_CONV_HEX_INT) ? 16u : 10u); + cbuf_len = npf_utoa_rev(val, cbuf, base, fs.case_adjust); + } + + if (val && fs.alt_form && (fs.conv_spec == NPF_FMT_SPEC_CONV_OCTAL)) { + cbuf[cbuf_len++] = '0'; // OK to add leading octal '0' immediately. + } + + if (val && fs.alt_form) { // 0x or 0b but can't write it yet. + if (fs.conv_spec == NPF_FMT_SPEC_CONV_HEX_INT) { + need_0x = 'X'; + } +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + else if (fs.conv_spec == NPF_FMT_SPEC_CONV_BINARY) { + need_0x = 'B'; + } +#endif + if (need_0x) { + need_0x += fs.case_adjust; + } + } + } break; + + case NPF_FMT_SPEC_CONV_POINTER: { + cbuf_len = npf_utoa_rev((npf_uint_t)(uintptr_t)va_arg(args, void *), cbuf, + 16, 'a' - 'A'); + need_0x = 'x'; + } break; + +#if NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS == 1 + case NPF_FMT_SPEC_CONV_WRITEBACK: + switch (fs.length_modifier) { + NPF_WRITEBACK(NONE, int); + NPF_WRITEBACK(SHORT, short); + NPF_WRITEBACK(LONG, long); + NPF_WRITEBACK(LONG_DOUBLE, double); + NPF_WRITEBACK(CHAR, signed char); +#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 + NPF_WRITEBACK(LARGE_LONG_LONG, long long); + NPF_WRITEBACK(LARGE_INTMAX, intmax_t); + NPF_WRITEBACK(LARGE_SIZET, size_t); + NPF_WRITEBACK(LARGE_PTRDIFFT, ptrdiff_t); +#endif + default: + break; + } + break; +#endif + +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + case NPF_FMT_SPEC_CONV_FLOAT_DEC: + case NPF_FMT_SPEC_CONV_FLOAT_SCI: + case NPF_FMT_SPEC_CONV_FLOAT_SHORTEST: + case NPF_FMT_SPEC_CONV_FLOAT_HEX: { + double val; + if (fs.length_modifier == NPF_FMT_SPEC_LEN_MOD_LONG_DOUBLE) { + val = (double)va_arg(args, long double); + } else { + val = va_arg(args, double); + } + + sign_c = (val < 0.) ? '-' : fs.prepend; +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + zero = (val == 0.); +#endif + cbuf_len = npf_ftoa_rev(cbuf, &fs, val); + } break; +#endif + default: + break; + } + +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + // Compute the field width pad character + if (fs.field_width_opt != NPF_FMT_SPEC_OPT_NONE) { + if (fs.leading_zero_pad) { // '0' flag is only legal with numeric types + if ((fs.conv_spec != NPF_FMT_SPEC_CONV_STRING) && + (fs.conv_spec != NPF_FMT_SPEC_CONV_CHAR) && + (fs.conv_spec != NPF_FMT_SPEC_CONV_PERCENT)) { +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + if ((fs.prec_opt != NPF_FMT_SPEC_OPT_NONE) && !fs.prec && zero) { + pad_c = ' '; + } else +#endif + { + pad_c = '0'; + } + } + } else { + pad_c = ' '; + } + } +#endif + + // Compute the number of bytes to truncate or '0'-pad. +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + if (fs.conv_spec != NPF_FMT_SPEC_CONV_STRING) { +#if NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS == 1 + // float precision is after the decimal point + if (fs.conv_spec != NPF_FMT_SPEC_CONV_FLOAT_DEC) +#endif + { + prec_pad = npf_max(0, fs.prec - cbuf_len); + } + } +#endif + +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + // Given the full converted length, how many pad bytes? + field_pad = fs.field_width - cbuf_len - !!sign_c; + if (need_0x) { + field_pad -= 2; + } +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + field_pad -= prec_pad; +#endif + field_pad = npf_max(0, field_pad); + + // Apply right-justified field width if requested + if (!fs.left_justified && pad_c) { // If leading zeros pad, sign goes first. + if (pad_c == '0') { + if (sign_c) { + NPF_PUTC(sign_c); + sign_c = 0; + } + // Pad byte is '0', write '0x' before '0' pad chars. + if (need_0x) { + NPF_PUTC('0'); + NPF_PUTC(need_0x); + } + } + while (field_pad-- > 0) { + NPF_PUTC(pad_c); + } + // Pad byte is ' ', write '0x' after ' ' pad chars but before number. + if ((pad_c != '0') && need_0x) { + NPF_PUTC('0'); + NPF_PUTC(need_0x); + } + } else +#endif + { + if (need_0x) { + NPF_PUTC('0'); + NPF_PUTC(need_0x); + } + } // no pad, '0x' requested. + + // Write the converted payload + if (fs.conv_spec == NPF_FMT_SPEC_CONV_STRING) { + for (int i = 0; i < cbuf_len; ++i) { + NPF_PUTC(cbuf[i]); + } + } else { + if (sign_c) { + NPF_PUTC(sign_c); + } +#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1 + while (prec_pad-- > 0) { + NPF_PUTC('0'); + } // int precision leads. +#endif +#if NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS == 1 + if (fs.conv_spec == NPF_FMT_SPEC_CONV_BINARY) { + while (cbuf_len) { + NPF_PUTC('0' + ((u.binval >> --cbuf_len) & 1)); + } + } else +#endif + { + while (cbuf_len-- > 0) { + NPF_PUTC(cbuf[cbuf_len]); + } + } // payload is reversed + } + +#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1 + if (fs.left_justified && pad_c) { // Apply left-justified field width + while (field_pad-- > 0) { + NPF_PUTC(pad_c); + } + } +#endif + } + + return pc_cnt.n; +} + +#undef NPF_PUTC +#undef NPF_EXTRACT +#undef NPF_WRITEBACK + +int npf_pprintf(npf_putc pc, void *pc_ctx, char const *format, ...) { + va_list val; + va_start(val, format); + int const rv = npf_vpprintf(pc, pc_ctx, format, val); + va_end(val); + return rv; +} + +int npf_snprintf(char *buffer, size_t bufsz, const char *format, ...) { + va_list val; + va_start(val, format); + int const rv = npf_vsnprintf(buffer, bufsz, format, val); + va_end(val); + return rv; +} + +int npf_vsnprintf(char *buffer, size_t bufsz, char const *format, + va_list vlist) { + npf_bufputc_ctx_t bufputc_ctx; + bufputc_ctx.dst = buffer; + bufputc_ctx.len = bufsz; + bufputc_ctx.cur = 0; + + npf_putc const pc = buffer ? npf_bufputc : npf_bufputc_nop; + int const n = npf_vpprintf(pc, &bufputc_ctx, format, vlist); + pc('\0', &bufputc_ctx); + + if (buffer && bufsz) { +#ifdef NANOPRINTF_SNPRINTF_SAFE_EMPTY_STRING_ON_OVERFLOW + if (n >= (int)bufsz) { + buffer[0] = '\0'; + } +#else + buffer[bufsz - 1] = '\0'; +#endif + } + + return n; +} + +#if NANOPRINTF_HAVE_GCC_WARNING_PRAGMAS +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // NANOPRINTF_IMPLEMENTATION_INCLUDED +#endif // NANOPRINTF_IMPLEMENTATION + +/* + nanoprintf is dual-licensed under both the "Unlicense" and the + "Zero-Clause BSD" (0BSD) licenses. The intent of this dual-licensing + structure is to make nanoprintf as consumable as possible in as many + environments / countries / companies as possible without any + encumberances. + + The text of the two licenses follows below: + + ============================== UNLICENSE ============================== + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + + ================================ 0BSD ================================= + + Copyright (C) 2019- by Charles Nicholson + + + Permission to use, copy, modify, and/or distribute this software for + any purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +void printf(char *format, ...); \ No newline at end of file diff --git a/limine.conf b/limine.conf new file mode 100755 index 0000000..0602bb9 --- /dev/null +++ b/limine.conf @@ -0,0 +1,12 @@ +# Timeout in seconds that Limine will use before automatically booting. +timeout: 3 +serial: yes +verbose: yes + +# The entry name that will be displayed in the boot menu. +/SILD - Soaplin 1.0 + # We use the Limine boot protocol. + protocol: limine + + # Path to the kernel to boot. boot():/ represents the partition on which limine.conf is located. + path: boot():/boot/kernel