Compare commits
No commits in common. "master" and "master" have entirely different histories.
|
@ -1 +1,2 @@
|
|||
target/
|
||||
/.idea
|
|
@ -1,5 +1,4 @@
|
|||
{
|
||||
"rust-analyzer.checkOnSave.allTargets": false,
|
||||
"rust-analyzer.showUnlinkedFileNotification": false,
|
||||
"C_Cpp.errorSquiggles": "disabled"
|
||||
"rust-analyzer.showUnlinkedFileNotification": false
|
||||
}
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
43
README.md
43
README.md
|
@ -1,18 +1,43 @@
|
|||
# AbleOS
|
||||
An UNIX-unlike micro-kernel written in rust with an embedded bytecode virtual machine.
|
||||
```
|
||||
TODO
|
||||
- Integrate HBVM
|
||||
HBVM also needs full spec compliance
|
||||
- Build out the object system
|
||||
- Build or Find an acceptable IDL
|
||||
Short List of potentials
|
||||
- [comline](https://git.ablecorp.us/DOOME1M8Cover/comline)
|
||||
- Work on a styleguide for commits
|
||||
Maybe something allong the lines of
|
||||
[relevant shorthand note] Explination
|
||||
- Build a scheduler for HBVM
|
||||
- Language support on HBVM
|
||||
- HBVM assembler (with IDL support)
|
||||
- HBVM Lisp/s-expr Compiler (Also (with (IDL (support))))
|
||||
- Documentation
|
||||
- Drivers
|
||||
- serial driver
|
||||
- PS/2 mouse driver
|
||||
- PS/2 Keyboard driver
|
||||
- VGA driver
|
||||
- SVGA driver
|
||||
- File system
|
||||
TarFS
|
||||
Pass in a tar file as an initrd and parse it with TarFS
|
||||
- VFS
|
||||
Being (written)[https://git.ablecorp.us/bee/ableos-vfs] by Bee
|
||||
- Disk driver
|
||||
- A ton more
|
||||
```
|
||||
|
||||
# Community
|
||||
[Discord](https://discord.gg/JrKVukDtgs)
|
||||
|
||||
Donations can be made [here on Liberapay](https://liberapay.com/AbleTheAbove) or on [Patreon](https://www.patreon.com/ablecorp)
|
||||
<img src="https://img.shields.io/liberapay/patrons/AbleTheAbove.svg?logo=liberapay">
|
||||
|
||||
|
||||
# Compiling
|
||||
AbleOS should be able to be built on any platform which is supported by
|
||||
[Rustc Tier 1 platform support](https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-1-with-host-tools).
|
||||
Firstly, I would like to apologize. I am not capable of supporting building on any random machine with any random operating system.
|
||||
|
||||
For running AbleOS, `repbuild` uses QEMU.
|
||||
AbleOS very likely builds with `nix-shell` on your operating system.
|
||||
|
||||
## Steps
|
||||
1. `git submodule update --init`
|
||||
2. `cargo repbuild`
|
||||
1. `cargo repbuild`
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
qemu-system-aarch64 -m 1024 -cpu cortex-a57 \
|
||||
-M virt -pflash "AAVMF_CODE.fd" \
|
||||
-device virtio-gpu-pci \
|
||||
-device virtio-mouse-device \
|
||||
-device virtio-keyboard-device \
|
||||
-kernel limine/BOOTX64.EFI
|
||||
# -device virtio-serial-pci \
|
||||
# -drive if=none,file=target/disk.img,id=hd0 \
|
||||
# -device virtio-blk-device,drive=hd0
|
||||
|
||||
# -kernel target/aarch64-virt-ableos/debug/kernel
|
|
@ -1,79 +0,0 @@
|
|||
digraph Drivers {
|
||||
InitSystem -> VFS;
|
||||
InitSystem -> Logger;
|
||||
|
||||
TCP -> NetworkingStack;
|
||||
UDP -> NetworkingStack;
|
||||
|
||||
NetworkingStack -> PhysLayer;
|
||||
PhysLayer -> Ethernet;
|
||||
|
||||
Ethernet -> Threec90x;
|
||||
Ethernet -> Intel8254x;
|
||||
Ethernet -> Ne2000;
|
||||
Ethernet -> RTL8139;
|
||||
Ethernet -> RTL8169;
|
||||
Ethernet -> IntelEtherneti217;
|
||||
Ethernet -> AMDPCnet;
|
||||
|
||||
PhysLayer -> Wifi;
|
||||
Wifi -> Eight02Dot11;
|
||||
|
||||
|
||||
|
||||
|
||||
Audio -> PCSpeaker;
|
||||
Audio -> SoundBlaster16;
|
||||
|
||||
RNG -> CpuRNG;
|
||||
RNG -> NetworkingStack;
|
||||
RNG -> GraphicsLibrary;
|
||||
RNG -> Input;
|
||||
|
||||
Slint -> GraphicsLibrary;
|
||||
GraphicsLibrary -> ShaderCompiler;
|
||||
ShaderCompiler -> GraphicsDriver;
|
||||
GraphicsLibrary -> GraphicsDriver;
|
||||
// Todo: dreak out the GPU into specific drivers
|
||||
GraphicsDriver -> GPU;
|
||||
|
||||
Logger -> Serial;
|
||||
Logger -> VFS;
|
||||
|
||||
Input -> Keyboard;
|
||||
Input -> GraphicsTablet;
|
||||
Input -> Mouse;
|
||||
Input -> Serial;
|
||||
Input -> Controllers;
|
||||
|
||||
Controllers -> Playstation;
|
||||
Playstation -> DualShock;
|
||||
Playstation -> DualSense;
|
||||
DualShock -> DualShock1;
|
||||
DualShock -> DualShock2;
|
||||
DualShock -> DualShock3;
|
||||
DualShock -> DualShock4;
|
||||
|
||||
|
||||
Mouse -> PS2Mouse;
|
||||
Mouse -> USBMouse;
|
||||
USBMouse -> GenericUSBMouse;
|
||||
Mouse -> MouseTrackPad;
|
||||
Mouse -> MouseTrackPoint;
|
||||
|
||||
VFS -> Fat32;
|
||||
VFS -> TarFS;
|
||||
VFS -> Ext2;
|
||||
|
||||
Ext2 -> VirtualDisk;
|
||||
TarFS -> VirtualDisk;
|
||||
Fat32 -> VirtualDisk;
|
||||
|
||||
VirtualDisk -> IDEDiskDriver;
|
||||
VirtualDisk -> ATADiskDriver;
|
||||
VirtualDisk -> FloppyController;
|
||||
VirtualDisk -> CDROM;
|
||||
VirtualDisk -> NVME;
|
||||
|
||||
BlueToothStack;
|
||||
}
|
|
@ -1,677 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
|
||||
-->
|
||||
<!-- Title: Drivers Pages: 1 -->
|
||||
<svg width="2629pt" height="404pt" viewBox="0.00 0.00 2628.89 404.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 400)">
|
||||
<title>Drivers</title>
|
||||
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-400 2624.8933,-400 2624.8933,4 -4,4"/>
|
||||
<!-- InitSystem -->
|
||||
<g id="node1" class="node">
|
||||
<title>InitSystem</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="443.0953" cy="-378" rx="52.7642" ry="18"/>
|
||||
<text text-anchor="middle" x="443.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">InitSystem</text>
|
||||
</g>
|
||||
<!-- VFS -->
|
||||
<g id="node2" class="node">
|
||||
<title>VFS</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="409.0953" cy="-234" rx="28.991" ry="18"/>
|
||||
<text text-anchor="middle" x="409.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">VFS</text>
|
||||
</g>
|
||||
<!-- InitSystem->VFS -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>InitSystem->VFS</title>
|
||||
<path fill="none" stroke="#000000" d="M437.8111,-360.0742C434.7997,-349.5989 431.0497,-336.0989 428.0953,-324 423.0522,-303.3476 418.1161,-279.8366 414.5395,-262.025"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="417.9306,-261.1317 412.55,-252.0049 411.0646,-262.4951 417.9306,-261.1317"/>
|
||||
</g>
|
||||
<!-- Logger -->
|
||||
<g id="node3" class="node">
|
||||
<title>Logger</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="476.0953" cy="-306" rx="38.8459" ry="18"/>
|
||||
<text text-anchor="middle" x="476.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">Logger</text>
|
||||
</g>
|
||||
<!-- InitSystem->Logger -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>InitSystem->Logger</title>
|
||||
<path fill="none" stroke="#000000" d="M451.2526,-360.2022C454.981,-352.0675 459.4807,-342.2501 463.6203,-333.2181"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="466.9326,-334.3915 467.9175,-323.8425 460.5691,-331.4749 466.9326,-334.3915"/>
|
||||
</g>
|
||||
<!-- Fat32 -->
|
||||
<g id="node46" class="node">
|
||||
<title>Fat32</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="282.0953" cy="-162" rx="33.0643" ry="18"/>
|
||||
<text text-anchor="middle" x="282.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">Fat32</text>
|
||||
</g>
|
||||
<!-- VFS->Fat32 -->
|
||||
<g id="edge46" class="edge">
|
||||
<title>VFS->Fat32</title>
|
||||
<path fill="none" stroke="#000000" d="M387.5515,-221.7862C367.3094,-210.3103 336.7716,-192.9976 313.7591,-179.9511"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="315.4597,-176.8919 305.0343,-175.0048 312.0074,-182.9814 315.4597,-176.8919"/>
|
||||
</g>
|
||||
<!-- TarFS -->
|
||||
<g id="node47" class="node">
|
||||
<title>TarFS</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="368.0953" cy="-162" rx="35.3489" ry="18"/>
|
||||
<text text-anchor="middle" x="368.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">TarFS</text>
|
||||
</g>
|
||||
<!-- VFS->TarFS -->
|
||||
<g id="edge47" class="edge">
|
||||
<title>VFS->TarFS</title>
|
||||
<path fill="none" stroke="#000000" d="M399.3789,-216.937C394.4978,-208.3654 388.4765,-197.7914 383.0242,-188.2165"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="386.0167,-186.3986 378.0268,-179.4407 379.9338,-189.8625 386.0167,-186.3986"/>
|
||||
</g>
|
||||
<!-- Ext2 -->
|
||||
<g id="node48" class="node">
|
||||
<title>Ext2</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="450.0953" cy="-162" rx="29.0548" ry="18"/>
|
||||
<text text-anchor="middle" x="450.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">Ext2</text>
|
||||
</g>
|
||||
<!-- VFS->Ext2 -->
|
||||
<g id="edge48" class="edge">
|
||||
<title>VFS->Ext2</title>
|
||||
<path fill="none" stroke="#000000" d="M418.8117,-216.937C423.6928,-208.3654 429.7141,-197.7914 435.1664,-188.2165"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="438.2568,-189.8625 440.1638,-179.4407 432.1739,-186.3986 438.2568,-189.8625"/>
|
||||
</g>
|
||||
<!-- Logger->VFS -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>Logger->VFS</title>
|
||||
<path fill="none" stroke="#000000" d="M460.5557,-289.3008C451.6839,-279.7669 440.4261,-267.6689 430.7037,-257.221"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="433.0079,-254.5593 423.6333,-249.6229 427.8834,-259.328 433.0079,-254.5593"/>
|
||||
</g>
|
||||
<!-- Serial -->
|
||||
<g id="node29" class="node">
|
||||
<title>Serial</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1400.0953" cy="-234" rx="33.6208" ry="18"/>
|
||||
<text text-anchor="middle" x="1400.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">Serial</text>
|
||||
</g>
|
||||
<!-- Logger->Serial -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>Logger->Serial</title>
|
||||
<path fill="none" stroke="#000000" d="M515.2345,-305.3369C663.9095,-302.5495 1193.4867,-290.1059 1357.0953,-252 1359.9033,-251.346 1362.7624,-250.5254 1365.6042,-249.5973"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1366.9168,-252.844 1375.0991,-246.1134 1364.5054,-246.2724 1366.9168,-252.844"/>
|
||||
</g>
|
||||
<!-- TCP -->
|
||||
<g id="node4" class="node">
|
||||
<title>TCP</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1436.0953" cy="-378" rx="28.991" ry="18"/>
|
||||
<text text-anchor="middle" x="1436.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">TCP</text>
|
||||
</g>
|
||||
<!-- NetworkingStack -->
|
||||
<g id="node5" class="node">
|
||||
<title>NetworkingStack</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1398.0953" cy="-306" rx="78.7318" ry="18"/>
|
||||
<text text-anchor="middle" x="1398.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">NetworkingStack</text>
|
||||
</g>
|
||||
<!-- TCP->NetworkingStack -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>TCP->NetworkingStack</title>
|
||||
<path fill="none" stroke="#000000" d="M1426.8966,-360.5708C1422.5145,-352.2679 1417.1746,-342.1502 1412.2886,-332.8925"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1415.3692,-331.2308 1407.6062,-324.0206 1409.1785,-334.4981 1415.3692,-331.2308"/>
|
||||
</g>
|
||||
<!-- PhysLayer -->
|
||||
<g id="node7" class="node">
|
||||
<title>PhysLayer</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1296.0953" cy="-234" rx="52.1675" ry="18"/>
|
||||
<text text-anchor="middle" x="1296.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">PhysLayer</text>
|
||||
</g>
|
||||
<!-- NetworkingStack->PhysLayer -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>NetworkingStack->PhysLayer</title>
|
||||
<path fill="none" stroke="#000000" d="M1373.6638,-288.7542C1359.8688,-279.0166 1342.4757,-266.7391 1327.6572,-256.279"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1329.4647,-253.2707 1319.2765,-250.3632 1325.4278,-258.9895 1329.4647,-253.2707"/>
|
||||
</g>
|
||||
<!-- UDP -->
|
||||
<g id="node6" class="node">
|
||||
<title>UDP</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1359.0953" cy="-378" rx="30.1958" ry="18"/>
|
||||
<text text-anchor="middle" x="1359.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">UDP</text>
|
||||
</g>
|
||||
<!-- UDP->NetworkingStack -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>UDP->NetworkingStack</title>
|
||||
<path fill="none" stroke="#000000" d="M1368.5361,-360.5708C1373.0335,-352.2679 1378.5139,-342.1502 1383.5285,-332.8925"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1386.6488,-334.4805 1388.3341,-324.0206 1380.4937,-331.1465 1386.6488,-334.4805"/>
|
||||
</g>
|
||||
<!-- Ethernet -->
|
||||
<g id="node8" class="node">
|
||||
<title>Ethernet</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="852.0953" cy="-162" rx="43.9983" ry="18"/>
|
||||
<text text-anchor="middle" x="852.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">Ethernet</text>
|
||||
</g>
|
||||
<!-- PhysLayer->Ethernet -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>PhysLayer->Ethernet</title>
|
||||
<path fill="none" stroke="#000000" d="M1248.5795,-226.2947C1164.418,-212.6469 989.8747,-184.3426 903.2098,-170.2888"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="903.5198,-166.7935 893.0885,-168.6475 902.3993,-173.7032 903.5198,-166.7935"/>
|
||||
</g>
|
||||
<!-- Wifi -->
|
||||
<g id="node16" class="node">
|
||||
<title>Wifi</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1314.0953" cy="-162" rx="28.9696" ry="18"/>
|
||||
<text text-anchor="middle" x="1314.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">Wifi</text>
|
||||
</g>
|
||||
<!-- PhysLayer->Wifi -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>PhysLayer->Wifi</title>
|
||||
<path fill="none" stroke="#000000" d="M1300.6375,-215.8314C1302.6137,-207.9266 1304.9735,-198.4872 1307.1612,-189.7365"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1310.587,-190.4637 1309.6169,-179.9134 1303.796,-188.7659 1310.587,-190.4637"/>
|
||||
</g>
|
||||
<!-- Threec90x -->
|
||||
<g id="node9" class="node">
|
||||
<title>Threec90x</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="452.0953" cy="-90" rx="52.1501" ry="18"/>
|
||||
<text text-anchor="middle" x="452.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">Threec90x</text>
|
||||
</g>
|
||||
<!-- Ethernet->Threec90x -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>Ethernet->Threec90x</title>
|
||||
<path fill="none" stroke="#000000" d="M810.0127,-157.0708C745.598,-149.1277 618.8877,-131.9297 513.0953,-108 508.9759,-107.0682 504.7257,-106.013 500.4758,-104.8921"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="501.1913,-101.4591 490.6213,-102.1845 499.3366,-108.2089 501.1913,-101.4591"/>
|
||||
</g>
|
||||
<!-- Intel8254x -->
|
||||
<g id="node10" class="node">
|
||||
<title>Intel8254x</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="575.0953" cy="-90" rx="52.7527" ry="18"/>
|
||||
<text text-anchor="middle" x="575.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">Intel8254x</text>
|
||||
</g>
|
||||
<!-- Ethernet->Intel8254x -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>Ethernet->Intel8254x</title>
|
||||
<path fill="none" stroke="#000000" d="M814.1219,-153.017C770.8839,-142.6703 698.1916,-124.9158 636.0953,-108 632.3083,-106.9684 628.3969,-105.8762 624.4686,-104.7602"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="625.3084,-101.3599 614.7304,-101.9578 623.3725,-108.0868 625.3084,-101.3599"/>
|
||||
</g>
|
||||
<!-- Ne2000 -->
|
||||
<g id="node11" class="node">
|
||||
<title>Ne2000</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="687.0953" cy="-90" rx="41.7172" ry="18"/>
|
||||
<text text-anchor="middle" x="687.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">Ne2000</text>
|
||||
</g>
|
||||
<!-- Ethernet->Ne2000 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>Ethernet->Ne2000</title>
|
||||
<path fill="none" stroke="#000000" d="M821.8318,-148.7941C794.9169,-137.0494 755.4014,-119.8063 726.1176,-107.0279"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="727.1771,-103.6716 716.6118,-102.8799 724.3774,-110.0873 727.1771,-103.6716"/>
|
||||
</g>
|
||||
<!-- RTL8139 -->
|
||||
<g id="node12" class="node">
|
||||
<title>RTL8139</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="795.0953" cy="-90" rx="48.6791" ry="18"/>
|
||||
<text text-anchor="middle" x="795.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">RTL8139</text>
|
||||
</g>
|
||||
<!-- Ethernet->RTL8139 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>Ethernet->RTL8139</title>
|
||||
<path fill="none" stroke="#000000" d="M838.2972,-144.5708C831.4167,-135.8797 822.962,-125.2001 815.3618,-115.5998"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="817.9151,-113.1862 808.9639,-107.5182 812.4268,-117.5312 817.9151,-113.1862"/>
|
||||
</g>
|
||||
<!-- RTL8169 -->
|
||||
<g id="node13" class="node">
|
||||
<title>RTL8169</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="910.0953" cy="-90" rx="48.6791" ry="18"/>
|
||||
<text text-anchor="middle" x="910.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">RTL8169</text>
|
||||
</g>
|
||||
<!-- Ethernet->RTL8169 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>Ethernet->RTL8169</title>
|
||||
<path fill="none" stroke="#000000" d="M866.1355,-144.5708C873.2597,-135.7269 882.0427,-124.8239 889.8803,-115.0945"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="892.6367,-117.2519 896.1844,-107.2687 887.1854,-112.8606 892.6367,-117.2519"/>
|
||||
</g>
|
||||
<!-- IntelEtherneti217 -->
|
||||
<g id="node14" class="node">
|
||||
<title>IntelEtherneti217</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1055.0953" cy="-90" rx="78.7298" ry="18"/>
|
||||
<text text-anchor="middle" x="1055.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">IntelEtherneti217</text>
|
||||
</g>
|
||||
<!-- Ethernet->IntelEtherneti217 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>Ethernet->IntelEtherneti217</title>
|
||||
<path fill="none" stroke="#000000" d="M885.6166,-150.1107C917.4561,-138.8178 965.8122,-121.6669 1002.7343,-108.5714"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1004.084,-111.8064 1012.3387,-105.1649 1001.744,-105.2091 1004.084,-111.8064"/>
|
||||
</g>
|
||||
<!-- AMDPCnet -->
|
||||
<g id="node15" class="node">
|
||||
<title>AMDPCnet</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1209.0953" cy="-90" rx="57.3418" ry="18"/>
|
||||
<text text-anchor="middle" x="1209.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">AMDPCnet</text>
|
||||
</g>
|
||||
<!-- Ethernet->AMDPCnet -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>Ethernet->AMDPCnet</title>
|
||||
<path fill="none" stroke="#000000" d="M893.2785,-155.4619C949.8599,-146.2284 1054.687,-128.222 1143.0953,-108 1147.513,-106.9895 1152.0799,-105.8804 1156.6536,-104.7245"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1157.8203,-108.0378 1166.6214,-102.1393 1156.063,-101.2619 1157.8203,-108.0378"/>
|
||||
</g>
|
||||
<!-- Eight02Dot11 -->
|
||||
<g id="node17" class="node">
|
||||
<title>Eight02Dot11</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1350.0953" cy="-90" rx="65.5161" ry="18"/>
|
||||
<text text-anchor="middle" x="1350.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">Eight02Dot11</text>
|
||||
</g>
|
||||
<!-- Wifi->Eight02Dot11 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>Wifi->Eight02Dot11</title>
|
||||
<path fill="none" stroke="#000000" d="M1322.8099,-144.5708C1326.9181,-136.3544 1331.9149,-126.3608 1336.5042,-117.1821"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1339.7433,-118.5301 1341.085,-108.0206 1333.4823,-115.3996 1339.7433,-118.5301"/>
|
||||
</g>
|
||||
<!-- Audio -->
|
||||
<g id="node18" class="node">
|
||||
<title>Audio</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2420.0953" cy="-378" rx="35.3548" ry="18"/>
|
||||
<text text-anchor="middle" x="2420.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">Audio</text>
|
||||
</g>
|
||||
<!-- PCSpeaker -->
|
||||
<g id="node19" class="node">
|
||||
<title>PCSpeaker</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2348.0953" cy="-306" rx="53.8905" ry="18"/>
|
||||
<text text-anchor="middle" x="2348.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">PCSpeaker</text>
|
||||
</g>
|
||||
<!-- Audio->PCSpeaker -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>Audio->PCSpeaker</title>
|
||||
<path fill="none" stroke="#000000" d="M2403.7574,-361.6621C2394.5427,-352.4474 2382.8487,-340.7534 2372.5602,-330.4649"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2374.9186,-327.8735 2365.3726,-323.2773 2369.9688,-332.8233 2374.9186,-327.8735"/>
|
||||
</g>
|
||||
<!-- SoundBlaster16 -->
|
||||
<g id="node20" class="node">
|
||||
<title>SoundBlaster16</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2493.0953" cy="-306" rx="72.9547" ry="18"/>
|
||||
<text text-anchor="middle" x="2493.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">SoundBlaster16</text>
|
||||
</g>
|
||||
<!-- Audio->SoundBlaster16 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>Audio->SoundBlaster16</title>
|
||||
<path fill="none" stroke="#000000" d="M2436.2964,-362.0209C2445.5577,-352.8864 2457.3757,-341.2303 2467.8308,-330.9184"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2470.485,-333.2166 2475.1469,-323.7025 2465.5695,-328.2328 2470.485,-333.2166"/>
|
||||
</g>
|
||||
<!-- RNG -->
|
||||
<g id="node21" class="node">
|
||||
<title>RNG</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1676.0953" cy="-378" rx="31.339" ry="18"/>
|
||||
<text text-anchor="middle" x="1676.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">RNG</text>
|
||||
</g>
|
||||
<!-- RNG->NetworkingStack -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>RNG->NetworkingStack</title>
|
||||
<path fill="none" stroke="#000000" d="M1647.3915,-370.5659C1603.4593,-359.1878 1518.5016,-337.1844 1460.0749,-322.0523"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1460.7723,-318.6175 1450.2142,-319.4984 1459.0172,-325.3939 1460.7723,-318.6175"/>
|
||||
</g>
|
||||
<!-- CpuRNG -->
|
||||
<g id="node22" class="node">
|
||||
<title>CpuRNG</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1725.0953" cy="-306" rx="47.5332" ry="18"/>
|
||||
<text text-anchor="middle" x="1725.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">CpuRNG</text>
|
||||
</g>
|
||||
<!-- RNG->CpuRNG -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>RNG->CpuRNG</title>
|
||||
<path fill="none" stroke="#000000" d="M1687.7076,-360.937C1693.6012,-352.277 1700.8858,-341.5731 1707.4548,-331.9207"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1710.4932,-333.677 1713.2259,-323.4407 1704.7062,-329.7386 1710.4932,-333.677"/>
|
||||
</g>
|
||||
<!-- GraphicsLibrary -->
|
||||
<g id="node23" class="node">
|
||||
<title>GraphicsLibrary</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2201.0953" cy="-306" rx="74.6976" ry="18"/>
|
||||
<text text-anchor="middle" x="2201.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">GraphicsLibrary</text>
|
||||
</g>
|
||||
<!-- RNG->GraphicsLibrary -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>RNG->GraphicsLibrary</title>
|
||||
<path fill="none" stroke="#000000" d="M1706.9764,-373.7649C1788.0277,-362.6493 2008.637,-332.3943 2125.7369,-316.3349"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2126.2743,-319.794 2135.706,-314.9677 2125.3232,-312.8589 2126.2743,-319.794"/>
|
||||
</g>
|
||||
<!-- Input -->
|
||||
<g id="node24" class="node">
|
||||
<title>Input</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1628.0953" cy="-306" rx="31.341" ry="18"/>
|
||||
<text text-anchor="middle" x="1628.0953" y="-301.8" font-family="Times,serif" font-size="14.00" fill="#000000">Input</text>
|
||||
</g>
|
||||
<!-- RNG->Input -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>RNG->Input</title>
|
||||
<path fill="none" stroke="#000000" d="M1664.72,-360.937C1658.8617,-352.1496 1651.6005,-341.2579 1645.0924,-331.4956"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1647.8482,-329.3196 1639.389,-322.9405 1642.0238,-333.2025 1647.8482,-329.3196"/>
|
||||
</g>
|
||||
<!-- ShaderCompiler -->
|
||||
<g id="node26" class="node">
|
||||
<title>ShaderCompiler</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2303.0953" cy="-234" rx="74.1566" ry="18"/>
|
||||
<text text-anchor="middle" x="2303.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">ShaderCompiler</text>
|
||||
</g>
|
||||
<!-- GraphicsLibrary->ShaderCompiler -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>GraphicsLibrary->ShaderCompiler</title>
|
||||
<path fill="none" stroke="#000000" d="M2225.2679,-288.937C2238.7614,-279.4122 2255.7576,-267.4149 2270.4221,-257.0635"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2272.5915,-259.8163 2278.7427,-251.19 2268.5546,-254.0975 2272.5915,-259.8163"/>
|
||||
</g>
|
||||
<!-- GraphicsDriver -->
|
||||
<g id="node27" class="node">
|
||||
<title>GraphicsDriver</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2303.0953" cy="-162" rx="71.1843" ry="18"/>
|
||||
<text text-anchor="middle" x="2303.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">GraphicsDriver</text>
|
||||
</g>
|
||||
<!-- GraphicsLibrary->GraphicsDriver -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>GraphicsLibrary->GraphicsDriver</title>
|
||||
<path fill="none" stroke="#000000" d="M2200.955,-287.8528C2201.653,-268.4612 2205.2852,-237.6002 2220.0953,-216 2229.5949,-202.1451 2243.9358,-190.9993 2258.0378,-182.5131"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2259.7731,-185.5528 2266.7421,-177.5726 2256.3176,-179.4651 2259.7731,-185.5528"/>
|
||||
</g>
|
||||
<!-- Input->Serial -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>Input->Serial</title>
|
||||
<path fill="none" stroke="#000000" d="M1599.2541,-298.6597C1562.5858,-289.0822 1497.5027,-271.2595 1443.0953,-252 1440.6921,-251.1493 1438.2293,-250.2354 1435.758,-249.2868"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1436.8768,-245.9651 1426.2915,-245.5159 1434.2863,-252.4682 1436.8768,-245.9651"/>
|
||||
</g>
|
||||
<!-- Keyboard -->
|
||||
<g id="node30" class="node">
|
||||
<title>Keyboard</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1628.0953" cy="-234" rx="49.2202" ry="18"/>
|
||||
<text text-anchor="middle" x="1628.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">Keyboard</text>
|
||||
</g>
|
||||
<!-- Input->Keyboard -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>Input->Keyboard</title>
|
||||
<path fill="none" stroke="#000000" d="M1628.0953,-287.8314C1628.0953,-280.131 1628.0953,-270.9743 1628.0953,-262.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1631.5954,-262.4132 1628.0953,-252.4133 1624.5954,-262.4133 1631.5954,-262.4132"/>
|
||||
</g>
|
||||
<!-- GraphicsTablet -->
|
||||
<g id="node31" class="node">
|
||||
<title>GraphicsTablet</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1766.0953" cy="-234" rx="70.622" ry="18"/>
|
||||
<text text-anchor="middle" x="1766.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">GraphicsTablet</text>
|
||||
</g>
|
||||
<!-- Input->GraphicsTablet -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>Input->GraphicsTablet</title>
|
||||
<path fill="none" stroke="#000000" d="M1651.5051,-293.7862C1671.8931,-283.149 1701.8932,-267.4967 1726.0835,-254.8757"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1727.7912,-257.9325 1735.0381,-250.2038 1724.5532,-251.7264 1727.7912,-257.9325"/>
|
||||
</g>
|
||||
<!-- Mouse -->
|
||||
<g id="node32" class="node">
|
||||
<title>Mouse</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1892.0953" cy="-234" rx="37.1405" ry="18"/>
|
||||
<text text-anchor="middle" x="1892.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">Mouse</text>
|
||||
</g>
|
||||
<!-- Input->Mouse -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>Input->Mouse</title>
|
||||
<path fill="none" stroke="#000000" d="M1652.2936,-294.0726C1657.4281,-291.8373 1662.8757,-289.6789 1668.0953,-288 1744.9312,-263.2853 1768.6672,-274.7915 1846.0953,-252 1848.7047,-251.2319 1851.3737,-250.3778 1854.0474,-249.4708"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1855.4284,-252.6936 1863.6524,-246.014 1853.058,-246.1072 1855.4284,-252.6936"/>
|
||||
</g>
|
||||
<!-- Controllers -->
|
||||
<g id="node33" class="node">
|
||||
<title>Controllers</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1506.0953" cy="-234" rx="54.4701" ry="18"/>
|
||||
<text text-anchor="middle" x="1506.0953" y="-229.8" font-family="Times,serif" font-size="14.00" fill="#000000">Controllers</text>
|
||||
</g>
|
||||
<!-- Input->Controllers -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>Input->Controllers</title>
|
||||
<path fill="none" stroke="#000000" d="M1606.002,-292.9613C1588.1773,-282.4418 1562.7456,-267.433 1542.0025,-255.1911"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1543.5325,-252.03 1533.1415,-249.9617 1539.9747,-258.0585 1543.5325,-252.03"/>
|
||||
</g>
|
||||
<!-- Slint -->
|
||||
<g id="node25" class="node">
|
||||
<title>Slint</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2201.0953" cy="-378" rx="29.0701" ry="18"/>
|
||||
<text text-anchor="middle" x="2201.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">Slint</text>
|
||||
</g>
|
||||
<!-- Slint->GraphicsLibrary -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>Slint->GraphicsLibrary</title>
|
||||
<path fill="none" stroke="#000000" d="M2201.0953,-359.8314C2201.0953,-352.131 2201.0953,-342.9743 2201.0953,-334.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2204.5954,-334.4132 2201.0953,-324.4133 2197.5954,-334.4133 2204.5954,-334.4132"/>
|
||||
</g>
|
||||
<!-- ShaderCompiler->GraphicsDriver -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>ShaderCompiler->GraphicsDriver</title>
|
||||
<path fill="none" stroke="#000000" d="M2303.0953,-215.8314C2303.0953,-208.131 2303.0953,-198.9743 2303.0953,-190.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2306.5954,-190.4132 2303.0953,-180.4133 2299.5954,-190.4133 2306.5954,-190.4132"/>
|
||||
</g>
|
||||
<!-- GPU -->
|
||||
<g id="node28" class="node">
|
||||
<title>GPU</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2303.0953" cy="-90" rx="30.1958" ry="18"/>
|
||||
<text text-anchor="middle" x="2303.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">GPU</text>
|
||||
</g>
|
||||
<!-- GraphicsDriver->GPU -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>GraphicsDriver->GPU</title>
|
||||
<path fill="none" stroke="#000000" d="M2303.0953,-143.8314C2303.0953,-136.131 2303.0953,-126.9743 2303.0953,-118.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2306.5954,-118.4132 2303.0953,-108.4133 2299.5954,-118.4133 2306.5954,-118.4132"/>
|
||||
</g>
|
||||
<!-- PS2Mouse -->
|
||||
<g id="node41" class="node">
|
||||
<title>PS2Mouse</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2161.0953" cy="-162" rx="52.77" ry="18"/>
|
||||
<text text-anchor="middle" x="2161.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">PS2Mouse</text>
|
||||
</g>
|
||||
<!-- Mouse->PS2Mouse -->
|
||||
<g id="edge41" class="edge">
|
||||
<title>Mouse->PS2Mouse</title>
|
||||
<path fill="none" stroke="#000000" d="M1925.5125,-225.5822C1966.4961,-215.1894 2038.0464,-196.8215 2099.0953,-180 2102.9364,-178.9416 2106.9061,-177.8301 2110.8948,-176.7007"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="2112.1314,-179.9875 2120.786,-173.8761 2110.2093,-173.2566 2112.1314,-179.9875"/>
|
||||
</g>
|
||||
<!-- USBMouse -->
|
||||
<g id="node42" class="node">
|
||||
<title>USBMouse</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1689.0953" cy="-162" rx="56.1995" ry="18"/>
|
||||
<text text-anchor="middle" x="1689.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">USBMouse</text>
|
||||
</g>
|
||||
<!-- Mouse->USBMouse -->
|
||||
<g id="edge42" class="edge">
|
||||
<title>Mouse->USBMouse</title>
|
||||
<path fill="none" stroke="#000000" d="M1862.9639,-222.3895C1857.3804,-220.2241 1851.569,-218.0113 1846.0953,-216 1810.0856,-202.7684 1769.0818,-188.6989 1738.0104,-178.2392"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1738.8841,-174.8407 1728.2902,-174.9757 1736.6561,-181.4766 1738.8841,-174.8407"/>
|
||||
</g>
|
||||
<!-- MouseTrackPad -->
|
||||
<g id="node44" class="node">
|
||||
<title>MouseTrackPad</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1837.0953" cy="-162" rx="74.1393" ry="18"/>
|
||||
<text text-anchor="middle" x="1837.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">MouseTrackPad</text>
|
||||
</g>
|
||||
<!-- Mouse->MouseTrackPad -->
|
||||
<g id="edge44" class="edge">
|
||||
<title>Mouse->MouseTrackPad</title>
|
||||
<path fill="none" stroke="#000000" d="M1879.0611,-216.937C1872.4765,-208.3173 1864.3453,-197.6727 1856.9988,-188.0555"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1859.6553,-185.7673 1850.8035,-179.9453 1854.0926,-190.0166 1859.6553,-185.7673"/>
|
||||
</g>
|
||||
<!-- MouseTrackPoint -->
|
||||
<g id="node45" class="node">
|
||||
<title>MouseTrackPoint</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2010.0953" cy="-162" rx="80.4577" ry="18"/>
|
||||
<text text-anchor="middle" x="2010.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">MouseTrackPoint</text>
|
||||
</g>
|
||||
<!-- Mouse->MouseTrackPoint -->
|
||||
<g id="edge45" class="edge">
|
||||
<title>Mouse->MouseTrackPoint</title>
|
||||
<path fill="none" stroke="#000000" d="M1915.4083,-219.7751C1931.9914,-209.6566 1954.5994,-195.8619 1973.5655,-184.2894"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1975.5507,-187.1782 1982.264,-178.9818 1971.9046,-181.2027 1975.5507,-187.1782"/>
|
||||
</g>
|
||||
<!-- Playstation -->
|
||||
<g id="node34" class="node">
|
||||
<title>Playstation</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1506.0953" cy="-162" rx="53.9078" ry="18"/>
|
||||
<text text-anchor="middle" x="1506.0953" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000">Playstation</text>
|
||||
</g>
|
||||
<!-- Controllers->Playstation -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>Controllers->Playstation</title>
|
||||
<path fill="none" stroke="#000000" d="M1506.0953,-215.8314C1506.0953,-208.131 1506.0953,-198.9743 1506.0953,-190.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1509.5954,-190.4132 1506.0953,-180.4133 1502.5954,-190.4133 1509.5954,-190.4132"/>
|
||||
</g>
|
||||
<!-- DualShock -->
|
||||
<g id="node35" class="node">
|
||||
<title>DualShock</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1488.0953" cy="-90" rx="53.8943" ry="18"/>
|
||||
<text text-anchor="middle" x="1488.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualShock</text>
|
||||
</g>
|
||||
<!-- Playstation->DualShock -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>Playstation->DualShock</title>
|
||||
<path fill="none" stroke="#000000" d="M1501.5531,-143.8314C1499.6069,-136.0463 1497.2885,-126.7729 1495.129,-118.1347"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1498.5195,-117.2658 1492.6986,-108.4133 1491.7285,-118.9636 1498.5195,-117.2658"/>
|
||||
</g>
|
||||
<!-- DualSense -->
|
||||
<g id="node36" class="node">
|
||||
<title>DualSense</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1612.0953" cy="-90" rx="52.1655" ry="18"/>
|
||||
<text text-anchor="middle" x="1612.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualSense</text>
|
||||
</g>
|
||||
<!-- Playstation->DualSense -->
|
||||
<g id="edge36" class="edge">
|
||||
<title>Playstation->DualSense</title>
|
||||
<path fill="none" stroke="#000000" d="M1529.8838,-145.8418C1544.6134,-135.8368 1563.7207,-122.8582 1579.8071,-111.9316"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1582.0806,-114.6184 1588.3862,-106.1043 1578.1474,-108.8279 1582.0806,-114.6184"/>
|
||||
</g>
|
||||
<!-- DualShock1 -->
|
||||
<g id="node37" class="node">
|
||||
<title>DualShock1</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1420.0953" cy="-18" rx="58.5521" ry="18"/>
|
||||
<text text-anchor="middle" x="1420.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualShock1</text>
|
||||
</g>
|
||||
<!-- DualShock->DualShock1 -->
|
||||
<g id="edge37" class="edge">
|
||||
<title>DualShock->DualShock1</title>
|
||||
<path fill="none" stroke="#000000" d="M1471.6344,-72.5708C1463.2603,-63.7041 1452.9315,-52.7678 1443.7247,-43.0194"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1446.0511,-40.3852 1436.6403,-35.5182 1440.962,-45.1916 1446.0511,-40.3852"/>
|
||||
</g>
|
||||
<!-- DualShock2 -->
|
||||
<g id="node38" class="node">
|
||||
<title>DualShock2</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1556.0953" cy="-18" rx="58.5521" ry="18"/>
|
||||
<text text-anchor="middle" x="1556.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualShock2</text>
|
||||
</g>
|
||||
<!-- DualShock->DualShock2 -->
|
||||
<g id="edge38" class="edge">
|
||||
<title>DualShock->DualShock2</title>
|
||||
<path fill="none" stroke="#000000" d="M1504.5562,-72.5708C1512.9303,-63.7041 1523.2591,-52.7678 1532.4659,-43.0194"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1535.2286,-45.1916 1539.5503,-35.5182 1530.1395,-40.3852 1535.2286,-45.1916"/>
|
||||
</g>
|
||||
<!-- DualShock3 -->
|
||||
<g id="node39" class="node">
|
||||
<title>DualShock3</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1692.0953" cy="-18" rx="58.5521" ry="18"/>
|
||||
<text text-anchor="middle" x="1692.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualShock3</text>
|
||||
</g>
|
||||
<!-- DualShock->DualShock3 -->
|
||||
<g id="edge39" class="edge">
|
||||
<title>DualShock->DualShock3</title>
|
||||
<path fill="none" stroke="#000000" d="M1525.512,-76.7941C1558.7364,-65.0678 1607.4912,-47.8603 1643.6793,-35.088"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1645.2646,-38.2401 1653.5296,-31.6114 1642.9348,-31.6392 1645.2646,-38.2401"/>
|
||||
</g>
|
||||
<!-- DualShock4 -->
|
||||
<g id="node40" class="node">
|
||||
<title>DualShock4</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1284.0953" cy="-18" rx="58.5521" ry="18"/>
|
||||
<text text-anchor="middle" x="1284.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">DualShock4</text>
|
||||
</g>
|
||||
<!-- DualShock->DualShock4 -->
|
||||
<g id="edge40" class="edge">
|
||||
<title>DualShock->DualShock4</title>
|
||||
<path fill="none" stroke="#000000" d="M1450.6786,-76.7941C1417.4541,-65.0678 1368.6994,-47.8603 1332.5113,-35.088"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1333.2558,-31.6392 1322.661,-31.6114 1330.926,-38.2401 1333.2558,-31.6392"/>
|
||||
</g>
|
||||
<!-- GenericUSBMouse -->
|
||||
<g id="node43" class="node">
|
||||
<title>GenericUSBMouse</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="1769.0953" cy="-90" rx="86.8165" ry="18"/>
|
||||
<text text-anchor="middle" x="1769.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">GenericUSBMouse</text>
|
||||
</g>
|
||||
<!-- USBMouse->GenericUSBMouse -->
|
||||
<g id="edge43" class="edge">
|
||||
<title>USBMouse->GenericUSBMouse</title>
|
||||
<path fill="none" stroke="#000000" d="M1708.0542,-144.937C1718.1905,-135.8144 1730.8468,-124.4237 1742.0028,-114.3833"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="1744.3455,-116.9836 1749.4371,-107.6924 1739.6627,-111.7806 1744.3455,-116.9836"/>
|
||||
</g>
|
||||
<!-- VirtualDisk -->
|
||||
<g id="node49" class="node">
|
||||
<title>VirtualDisk</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="325.0953" cy="-90" rx="56.7561" ry="18"/>
|
||||
<text text-anchor="middle" x="325.0953" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">VirtualDisk</text>
|
||||
</g>
|
||||
<!-- Fat32->VirtualDisk -->
|
||||
<g id="edge51" class="edge">
|
||||
<title>Fat32->VirtualDisk</title>
|
||||
<path fill="none" stroke="#000000" d="M292.5044,-144.5708C297.5524,-136.1184 303.7236,-125.7851 309.3328,-116.3931"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="312.3608,-118.1489 314.4833,-107.7689 306.351,-114.5597 312.3608,-118.1489"/>
|
||||
</g>
|
||||
<!-- TarFS->VirtualDisk -->
|
||||
<g id="edge50" class="edge">
|
||||
<title>TarFS->VirtualDisk</title>
|
||||
<path fill="none" stroke="#000000" d="M357.6862,-144.5708C352.6382,-136.1184 346.467,-125.7851 340.8578,-116.3931"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="343.8396,-114.5597 335.7073,-107.7689 337.8298,-118.1489 343.8396,-114.5597"/>
|
||||
</g>
|
||||
<!-- Ext2->VirtualDisk -->
|
||||
<g id="edge49" class="edge">
|
||||
<title>Ext2->VirtualDisk</title>
|
||||
<path fill="none" stroke="#000000" d="M428.607,-149.6228C410.2018,-139.0214 383.3012,-123.5266 361.5364,-110.9901"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="363.2806,-107.9557 352.8684,-105.9973 359.7868,-114.0214 363.2806,-107.9557"/>
|
||||
</g>
|
||||
<!-- IDEDiskDriver -->
|
||||
<g id="node50" class="node">
|
||||
<title>IDEDiskDriver</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="453.0953" cy="-18" rx="70.622" ry="18"/>
|
||||
<text text-anchor="middle" x="453.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">IDEDiskDriver</text>
|
||||
</g>
|
||||
<!-- VirtualDisk->IDEDiskDriver -->
|
||||
<g id="edge52" class="edge">
|
||||
<title>VirtualDisk->IDEDiskDriver</title>
|
||||
<path fill="none" stroke="#000000" d="M353.1854,-74.1993C371.3097,-64.0044 395.1147,-50.6141 414.9419,-39.4613"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="416.7372,-42.4672 423.737,-34.514 413.3053,-36.3662 416.7372,-42.4672"/>
|
||||
</g>
|
||||
<!-- ATADiskDriver -->
|
||||
<g id="node51" class="node">
|
||||
<title>ATADiskDriver</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="616.0953" cy="-18" rx="74.1354" ry="18"/>
|
||||
<text text-anchor="middle" x="616.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">ATADiskDriver</text>
|
||||
</g>
|
||||
<!-- VirtualDisk->ATADiskDriver -->
|
||||
<g id="edge53" class="edge">
|
||||
<title>VirtualDisk->ATADiskDriver</title>
|
||||
<path fill="none" stroke="#000000" d="M368.0029,-78.0928C375.6815,-76.0205 383.6171,-73.9167 391.0953,-72 445.1811,-58.1378 506.8603,-43.4105 551.945,-32.8436"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="552.9392,-36.2055 561.879,-30.5196 551.3446,-29.3896 552.9392,-36.2055"/>
|
||||
</g>
|
||||
<!-- FloppyController -->
|
||||
<g id="node52" class="node">
|
||||
<title>FloppyController</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="78.0953" cy="-18" rx="78.1907" ry="18"/>
|
||||
<text text-anchor="middle" x="78.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">FloppyController</text>
|
||||
</g>
|
||||
<!-- VirtualDisk->FloppyController -->
|
||||
<g id="edge54" class="edge">
|
||||
<title>VirtualDisk->FloppyController</title>
|
||||
<path fill="none" stroke="#000000" d="M283.1951,-77.7862C242.8032,-66.012 181.3328,-48.0935 136.2175,-34.9425"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="137.1453,-31.5673 126.5653,-32.1289 135.1863,-38.2877 137.1453,-31.5673"/>
|
||||
</g>
|
||||
<!-- CDROM -->
|
||||
<g id="node53" class="node">
|
||||
<title>CDROM</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="221.0953" cy="-18" rx="46.3875" ry="18"/>
|
||||
<text text-anchor="middle" x="221.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">CDROM</text>
|
||||
</g>
|
||||
<!-- VirtualDisk->CDROM -->
|
||||
<g id="edge55" class="edge">
|
||||
<title>VirtualDisk->CDROM</title>
|
||||
<path fill="none" stroke="#000000" d="M301.2356,-73.4817C286.7642,-63.4631 268.1319,-50.5638 252.4754,-39.7247"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="254.3431,-36.7608 244.1289,-33.9463 250.3586,-42.5161 254.3431,-36.7608"/>
|
||||
</g>
|
||||
<!-- NVME -->
|
||||
<g id="node54" class="node">
|
||||
<title>NVME</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="325.0953" cy="-18" rx="39.4254" ry="18"/>
|
||||
<text text-anchor="middle" x="325.0953" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">NVME</text>
|
||||
</g>
|
||||
<!-- VirtualDisk->NVME -->
|
||||
<g id="edge56" class="edge">
|
||||
<title>VirtualDisk->NVME</title>
|
||||
<path fill="none" stroke="#000000" d="M325.0953,-71.8314C325.0953,-64.131 325.0953,-54.9743 325.0953,-46.4166"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="328.5954,-46.4132 325.0953,-36.4133 321.5954,-46.4133 328.5954,-46.4132"/>
|
||||
</g>
|
||||
<!-- BlueToothStack -->
|
||||
<g id="node55" class="node">
|
||||
<title>BlueToothStack</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="2547.0953" cy="-378" rx="73.5965" ry="18"/>
|
||||
<text text-anchor="middle" x="2547.0953" y="-373.8" font-family="Times,serif" font-size="14.00" fill="#000000">BlueToothStack</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 36 KiB |
|
@ -1,32 +0,0 @@
|
|||
# TODO
|
||||
- Build out the object system
|
||||
- Build or Find an acceptable IDL
|
||||
Short List of potentials
|
||||
- [comline](https://git.ablecorp.us/DOOME1M8Cover/comline)
|
||||
- Work on a styleguide for commits
|
||||
Maybe something allong the lines of
|
||||
[relevant shorthand note] Explination
|
||||
- Language support on HBVM
|
||||
- HBVM assembler (with IDL support)
|
||||
- HBVM Lisp/s-expr Compiler (Also (with (IDL (support))))
|
||||
- Documentation
|
||||
- Drivers
|
||||
- serial driver
|
||||
- PS/2 mouse driver
|
||||
- PS/2 Keyboard driver
|
||||
- VGA driver
|
||||
- SVGA driver
|
||||
- File system
|
||||
- Depends on Disk driver
|
||||
- TarFS
|
||||
Pass in a tar file as an initrd and parse it with TarFS
|
||||
- VFS
|
||||
Being (written)[https://git.ablecorp.us/bee/ableos-vfs] by Bee
|
||||
- Disk driver
|
||||
- IDE Driver
|
||||
- ATA Driver
|
||||
- Floppy Driver
|
||||
- A ton more
|
||||
- Port (Slint)[https://slint.dev]
|
||||
- Depends on
|
||||
- Graphics Driver
|
|
@ -5,30 +5,30 @@ version = "0.2.0"
|
|||
|
||||
|
||||
[dependencies]
|
||||
embedded-graphics = "0.7"
|
||||
hbvm.git = "https://git.ablecorp.us/ableos/holey-bytes"
|
||||
log = "0.4"
|
||||
spin = "0.9"
|
||||
uart_16550 = "0.2"
|
||||
slab = { version = "0.4", default-features = false }
|
||||
xml.git = "https://git.ablecorp.us/ableos/ableos_userland"
|
||||
versioning.git = "https://git.ablecorp.us/ableos/ableos_userland"
|
||||
able_graphics_library.git = "https://git.ablecorp.us/ableos/ableos_userland"
|
||||
hashbrown = "*"
|
||||
kiam = "0.1.1"
|
||||
limine = { version = "0.1", git = "https://github.com/limine-bootloader/limine-rs" }
|
||||
|
||||
[dependencies.limine]
|
||||
version = "0.1"
|
||||
git = "https://github.com/limine-bootloader/limine-rs"
|
||||
hbvm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
|
||||
# hbasm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
|
||||
|
||||
embedded-graphics = "0.7.1"
|
||||
|
||||
|
||||
error-stack = { version = "0.3", default-features = false }
|
||||
log = "0.4"
|
||||
spin = "0.9"
|
||||
uart_16550 = "0.2"
|
||||
slab = { version = "0.4", default-features = false }
|
||||
xml = { git = "https://git.ablecorp.us/ableos/ableos_userland" }
|
||||
|
||||
clparse = { git = "https://git.ablecorp.us/ableos/ableos_userland", default-features = false }
|
||||
versioning = { git = "https://git.ablecorp.us/ableos/ableos_userland" }
|
||||
able_graphics_library = { git = "https://git.ablecorp.us/ableos/ableos_userland" }
|
||||
hashbrown = "*"
|
||||
|
||||
[dependencies.crossbeam-queue]
|
||||
version = "0.3"
|
||||
default-features = false
|
||||
features = ["alloc"]
|
||||
|
||||
[dependencies.clparse]
|
||||
git = "https://git.ablecorp.us/ableos/ableos_userland"
|
||||
version = "0.3"
|
||||
default-features = false
|
||||
features = ["alloc"]
|
||||
|
||||
[dependencies.derive_more]
|
||||
version = "0.99"
|
||||
|
|
|
@ -7,17 +7,8 @@ SECTIONS
|
|||
.text : { *(.text) }
|
||||
.data : { *(.data) }
|
||||
.rodata : { *(.rodata) }
|
||||
.bss : {
|
||||
*(COMMON)
|
||||
*(.bss .bss.*)
|
||||
.bss : { *(.bss) }
|
||||
|
||||
/* Align initial kernel heap to page boundary */
|
||||
. = ALIGN(4K);
|
||||
PROVIDE(_initial_kernel_heap_start = .);
|
||||
/* PROVIDE(_initial_kernel_heap_size = 1024 * 1024); */
|
||||
PROVIDE(_initial_kernel_heap_size = 1024 * 4096 * 100);
|
||||
. += _initial_kernel_heap_size;
|
||||
} :data
|
||||
. = ALIGN(8);
|
||||
. = . + 0x4000;
|
||||
LD_STACK_PTR = .;
|
||||
|
|
|
@ -150,8 +150,7 @@ impl Heap {
|
|||
#[cfg(debug_assertions)]
|
||||
trace!("Allocating {:?}", ptr);
|
||||
}
|
||||
|
||||
unsafe { core::ptr::write_bytes(ptr, 0, size) };
|
||||
// FIXME: zero out memory to prevent leaking data
|
||||
|
||||
assert!(ptr.is_aligned_to(alignment));
|
||||
NonNull::new(ptr)
|
||||
|
@ -169,7 +168,6 @@ impl Heap {
|
|||
self.bitmap_set_range(start, size, false);
|
||||
self.allocated_chunks -= size;
|
||||
// FIXME: zero out memory to prevent leaking data
|
||||
// REPLY: When we zero on alloc, do we really need it?
|
||||
}
|
||||
|
||||
/// Finds first hole that can fit an allocation of `size` chunks, returns the start of the
|
||||
|
@ -324,7 +322,7 @@ impl Heap {
|
|||
(unsafe { *self.bitmap.add(index / 8) } & (1 << (index % 8))) != 0
|
||||
}
|
||||
|
||||
pub const fn free_chunks(&self) -> usize {
|
||||
const fn free_chunks(&self) -> usize {
|
||||
self.total_chunks - self.allocated_chunks
|
||||
}
|
||||
|
||||
|
@ -345,7 +343,3 @@ fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
|||
// Todo: Maybe panic here instead
|
||||
crate::arch::spin_loop()
|
||||
}
|
||||
|
||||
pub fn get_free_chunks_count() -> usize {
|
||||
ALLOCATOR.0.lock().as_ref().unwrap().free_chunks()
|
||||
}
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
use {
|
||||
crate::{alloc::string::ToString, device_tree::DeviceTree, kmain::DEVICE_TREE},
|
||||
alloc::string::String,
|
||||
core::arch::asm,
|
||||
xml::XMLElement,
|
||||
};
|
||||
|
||||
pub fn collect_device_info() {
|
||||
log::trace!("Collecting devices on aarch64");
|
||||
// Lock device tree
|
||||
unsafe {
|
||||
DEVICE_TREE.force_unlock();
|
||||
}
|
||||
let device_tree = &mut DEVICE_TREE.lock();
|
||||
collect_cpu_info(device_tree);
|
||||
// let dt = DEVICE_TREE.lock();
|
||||
}
|
||||
|
||||
fn collect_cpu_info(device_tree: &mut DeviceTree) {
|
||||
let mut cpu = XMLElement::new("cpu");
|
||||
|
||||
let cpu_id = cpu_id();
|
||||
|
||||
cpu.set_attribute("CPU Name", cpu_id.0);
|
||||
cpu.set_attribute("CPU Id", cpu_id.1);
|
||||
|
||||
let cpus = device_tree.devices.get_mut("CPUs").unwrap();
|
||||
cpus.push(cpu);
|
||||
}
|
||||
|
||||
fn cpu_id() -> (String, u64) {
|
||||
let mut cpu_id: u64 = 0;
|
||||
unsafe {
|
||||
asm!("mrs {cpu_id}, MIDR_EL1",
|
||||
cpu_id = out(reg) cpu_id,
|
||||
)
|
||||
}
|
||||
|
||||
let cpu_name = match cpu_id {
|
||||
// the source of these two was a stackoverflow question
|
||||
// https://raspberrypi.stackexchange.com/questions/117175/how-do-i-read-the-cpuid-in-aarch64-asm
|
||||
0x410FD034 => "Cortex-A53".to_string(),
|
||||
0x410FD083 => "Cortex-A72".to_string(),
|
||||
_ => "Unknown".to_string(),
|
||||
};
|
||||
log::trace!("CPU Name: {cpu_name} - CPU ID: 0x{:X}", cpu_id);
|
||||
|
||||
(cpu_name, cpu_id)
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
use {crate::logger::TERMINAL_LOGGER, core::fmt::Write, spin::Mutex};
|
||||
const SERIAL_CONSOLE: Mutex<SerialConsole> = Mutex::new(SerialConsole {
|
||||
uart: 0x09000000 as *mut u8,
|
||||
});
|
||||
|
||||
struct SerialConsole {
|
||||
uart: *mut u8,
|
||||
}
|
||||
|
||||
impl core::fmt::Write for SerialConsole {
|
||||
fn write_str(&mut self, s: &str) -> core::fmt::Result {
|
||||
for c in s.chars() {
|
||||
unsafe { *self.uart = c as u8 }
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn log(args: core::fmt::Arguments<'_>) -> core::fmt::Result {
|
||||
SERIAL_CONSOLE.lock().write_fmt(args)?;
|
||||
TERMINAL_LOGGER.lock().write_fmt(args)?;
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -1,105 +1,19 @@
|
|||
pub use logging::log;
|
||||
use {
|
||||
crate::{allocator, bootmodules::BootModule, kmain::kmain},
|
||||
core::arch::asm,
|
||||
limine::FramebufferRequest,
|
||||
};
|
||||
mod device_info_collector;
|
||||
use device_info_collector::collect_device_info;
|
||||
|
||||
pub mod logging;
|
||||
use limine::HhdmRequest;
|
||||
extern "C" {
|
||||
fn _initial_kernel_heap_start();
|
||||
fn _initial_kernel_heap_size();
|
||||
}
|
||||
const INITIAL_KERNEL_HEAP_START: *mut u8 = _initial_kernel_heap_start as _;
|
||||
const INITIAL_KERNEL_HEAP_SIZE: *const () = _initial_kernel_heap_size as _;
|
||||
use {core::arch::asm, limine::FramebufferRequest};
|
||||
|
||||
pub const PAGE_SIZE: usize = 4096;
|
||||
static FB_REQ: FramebufferRequest = FramebufferRequest::new(0);
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn _kernel_start() -> ! {
|
||||
crate::logger::init().expect("failed to set logger");
|
||||
log::info!("Initialising AKern {}", crate::VERSION);
|
||||
static FB_REQ: FramebufferRequest = FramebufferRequest::new(0);
|
||||
let fb1 = &FB_REQ.get_response().get().unwrap().framebuffers()[0];
|
||||
|
||||
static HDHM_REQ: HhdmRequest = HhdmRequest::new(0);
|
||||
// memory::init_pt(VirtAddr::new(
|
||||
// HDHM_REQ
|
||||
// .get_response()
|
||||
// .get()
|
||||
// .expect("tried to get physical memory mapping offset from Limine")
|
||||
// .offset,
|
||||
// ));
|
||||
allocator::init(INITIAL_KERNEL_HEAP_START, INITIAL_KERNEL_HEAP_SIZE as _);
|
||||
|
||||
collect_device_info();
|
||||
|
||||
let bm = MOD_REQ.get_response().get();
|
||||
use limine::{KernelFileRequest, ModuleRequest};
|
||||
static KFILE_REQ: KernelFileRequest = KernelFileRequest::new(0);
|
||||
static MOD_REQ: ModuleRequest = ModuleRequest::new(0);
|
||||
|
||||
let mut bootmodules = alloc::vec::Vec::new();
|
||||
|
||||
if bm.is_some() {
|
||||
let bm = bm.unwrap();
|
||||
for x in 0..bm.module_count {
|
||||
let file = bm.modules().get(x as usize);
|
||||
if file.is_some() {
|
||||
let file = file.unwrap();
|
||||
let raw_bytes = core::slice::from_raw_parts(
|
||||
file.base.as_ptr().expect("invalid initrd"),
|
||||
file.length as usize,
|
||||
)
|
||||
.to_vec();
|
||||
|
||||
let file_path = alloc::string::String::from_utf8(
|
||||
file.path.to_str().unwrap().to_bytes().to_vec(),
|
||||
);
|
||||
if file_path.is_err() {
|
||||
panic!("invalid file path: {:?}", file_path);
|
||||
}
|
||||
let file_cmd = alloc::string::String::from_utf8(
|
||||
file.cmdline.to_str().unwrap().to_bytes().to_vec(),
|
||||
);
|
||||
if file_cmd.is_err() {
|
||||
panic!("invalid module cmd: {:?}", file_cmd);
|
||||
}
|
||||
|
||||
log::trace!("module path: {:?}", file_path);
|
||||
log::trace!("module cmd: {:?}", file_cmd);
|
||||
|
||||
bootmodules.push(BootModule::new(
|
||||
file_path.unwrap(),
|
||||
raw_bytes,
|
||||
file_cmd.unwrap(),
|
||||
));
|
||||
} else {
|
||||
log::error!("You should not be here");
|
||||
break;
|
||||
}
|
||||
for i in 0..100_usize {
|
||||
let offset = i * fb1.pitch as usize + i * 4;
|
||||
unsafe {
|
||||
*(fb1.address.as_ptr().unwrap().offset(offset as isize) as *mut u32) = 0xFFFFFFFF;
|
||||
}
|
||||
log::info!("Boot module count: {:?}", bootmodules.len());
|
||||
assert_eq!(bm.module_count, bootmodules.len() as u64);
|
||||
}
|
||||
|
||||
crate::kmain::kmain(
|
||||
KFILE_REQ
|
||||
.get_response()
|
||||
.get()
|
||||
.and_then(|r| r.kernel_file.get())
|
||||
.expect("failed to get kernel file from Limine")
|
||||
.cmdline
|
||||
.to_str()
|
||||
.map(core::ffi::CStr::to_str)
|
||||
.transpose()
|
||||
.expect("expected valid cmdline string")
|
||||
.unwrap_or_default(),
|
||||
bootmodules,
|
||||
);
|
||||
|
||||
spin_loop();
|
||||
}
|
||||
|
||||
|
@ -113,6 +27,6 @@ pub fn hardware_random_u64() -> u64 {
|
|||
0
|
||||
}
|
||||
|
||||
pub fn register_dump() {}
|
||||
#[no_mangle]
|
||||
pub fn fmod() {}
|
||||
pub fn log(_args: core::fmt::Arguments<'_>) -> core::fmt::Result {
|
||||
panic!()
|
||||
}
|
||||
|
|
|
@ -1,46 +1,37 @@
|
|||
mod memory;
|
||||
|
||||
use {
|
||||
alloc::boxed::Box,
|
||||
core::{
|
||||
arch::{asm, global_asm},
|
||||
fmt::Write,
|
||||
},
|
||||
sbi::system_reset::{system_reset, ResetReason, ResetType},
|
||||
spin::{Mutex, Once},
|
||||
uart_16550::MmioSerialPort,
|
||||
};
|
||||
use core::{arch::{asm, global_asm}, fmt::Write};
|
||||
use alloc::boxed::Box;
|
||||
use sbi::system_reset::{ResetType, ResetReason, system_reset};
|
||||
use spin::{Mutex, Once};
|
||||
use uart_16550::MmioSerialPort;
|
||||
|
||||
use crate::{
|
||||
allocator,
|
||||
arch::riscv64::memory::{PageEntryFlags, PageSize, PageTable, PAGE_TABLE},
|
||||
memory::PhysicalAddress,
|
||||
};
|
||||
use crate::{allocator, memory::PhysicalAddress, arch::riscv64::memory::{PAGE_TABLE, PageEntryFlags, PageSize, PageTable}};
|
||||
|
||||
global_asm!(include_str!("entry.s"));
|
||||
global_asm!(include_str!("memory_regions.s"));
|
||||
|
||||
pub const PAGE_SIZE: usize = 4096;
|
||||
|
||||
extern "C" {
|
||||
extern {
|
||||
static TEXT_START: PhysicalAddress;
|
||||
static TEXT_END: PhysicalAddress;
|
||||
|
||||
static RODATA_START: PhysicalAddress;
|
||||
static RODATA_END: PhysicalAddress;
|
||||
|
||||
|
||||
static DATA_START: PhysicalAddress;
|
||||
static DATA_END: PhysicalAddress;
|
||||
|
||||
static SDATA_START: PhysicalAddress;
|
||||
static SDATA_END: PhysicalAddress;
|
||||
|
||||
|
||||
static BSS_START: PhysicalAddress;
|
||||
static BSS_END: PhysicalAddress;
|
||||
|
||||
|
||||
static INITIAL_KERNEL_HEAP_START: PhysicalAddress;
|
||||
static INITIAL_KERNEL_HEAP_SIZE: usize;
|
||||
|
||||
|
||||
static USABLE_MEMORY_START: PhysicalAddress;
|
||||
static USABLE_MEMORY_SIZE: usize;
|
||||
}
|
||||
|
@ -48,15 +39,12 @@ extern "C" {
|
|||
static SERIAL_CONSOLE: Once<Mutex<MmioSerialPort>> = Once::new();
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn _kernel_start() -> ! {
|
||||
unsafe extern fn _kernel_start() -> ! {
|
||||
SERIAL_CONSOLE.call_once(|| Mutex::new(unsafe { MmioSerialPort::new(0x1000_0000) }));
|
||||
crate::logger::init().expect("failed to set logger");
|
||||
log::info!("Initialising AKern {}", crate::VERSION);
|
||||
|
||||
allocator::init(
|
||||
INITIAL_KERNEL_HEAP_START.as_mut_ptr::<u8>(),
|
||||
INITIAL_KERNEL_HEAP_SIZE,
|
||||
);
|
||||
allocator::init(INITIAL_KERNEL_HEAP_START.as_mut_ptr::<u8>(), INITIAL_KERNEL_HEAP_SIZE);
|
||||
memory::init(USABLE_MEMORY_START.into(), USABLE_MEMORY_SIZE / PAGE_SIZE);
|
||||
|
||||
let mut page_table_addr = PAGE_TABLE.get().unwrap().lock();
|
||||
|
@ -73,17 +61,9 @@ unsafe extern "C" fn _kernel_start() -> ! {
|
|||
// Map bss section (includes stack and initial kernel heap)
|
||||
page_table.identity_map_range(BSS_START, BSS_END, PageEntryFlags::ReadWrite);
|
||||
// Map usable memory range (as rw so not executable)
|
||||
page_table.identity_map_range(
|
||||
USABLE_MEMORY_START,
|
||||
USABLE_MEMORY_START + USABLE_MEMORY_SIZE.into(),
|
||||
PageEntryFlags::ReadWrite,
|
||||
);
|
||||
page_table.identity_map_range(USABLE_MEMORY_START, USABLE_MEMORY_START + USABLE_MEMORY_SIZE.into(), PageEntryFlags::ReadWrite);
|
||||
// Map Uart so we can continue using serial
|
||||
page_table.identity_map(
|
||||
0x1000_0000_usize.into(),
|
||||
PageEntryFlags::ReadWrite,
|
||||
PageSize::Size4KiB,
|
||||
);
|
||||
page_table.identity_map(0x1000_0000_usize.into(), PageEntryFlags::ReadWrite, PageSize::Size4KiB);
|
||||
|
||||
let table_ppn = page_table_addr.as_addr() as usize >> 12;
|
||||
let satp_value = 8 << 60 | table_ppn;
|
||||
|
|
|
@ -53,7 +53,6 @@ fn collect_cpu_info(device_tree: &mut DeviceTree) {
|
|||
}
|
||||
|
||||
pub fn collect_device_info() {
|
||||
log::trace!("Collecting devices on x86_64");
|
||||
// Lock device tree
|
||||
unsafe {
|
||||
DEVICE_TREE.force_unlock();
|
||||
|
|
|
@ -1 +1,69 @@
|
|||
use {limine::NonNullPtr};
|
||||
|
||||
use {
|
||||
crate::{kmain::DEVICE_TREE},
|
||||
able_graphics_library::raw_pixel::Display,
|
||||
embedded_graphics::{pixelcolor::Rgb888, prelude::*},
|
||||
limine::{Framebuffer, FramebufferRequest},
|
||||
spin::{Lazy, Mutex},
|
||||
};
|
||||
|
||||
pub static DISPLAY: Lazy<Mutex<Display>> = Lazy::new(|| {
|
||||
static FB_REQ: FramebufferRequest = FramebufferRequest::new(0);
|
||||
let fb1: &NonNullPtr<Framebuffer> = &FB_REQ.get_response().get().unwrap().framebuffers()[0];
|
||||
|
||||
{
|
||||
use crate::alloc::string::ToString;
|
||||
let mut dt = DEVICE_TREE.lock();
|
||||
let mut disp = xml::XMLElement::new("display_0");
|
||||
|
||||
disp.set_attribute("width", fb1.width);
|
||||
disp.set_attribute("height", fb1.height);
|
||||
disp.set_attribute("bits per pixel", fb1.bpp);
|
||||
dt.devices.insert("Displays".to_string(), alloc::vec![disp]);
|
||||
}
|
||||
let _size: usize = (fb1.width * fb1.height).try_into().unwrap();
|
||||
let back_buffer: alloc::vec::Vec<u32> = alloc::vec![0; 800*600];
|
||||
|
||||
let m = Mutex::new(Display {
|
||||
fb: fb1.address.as_ptr().unwrap().cast(),
|
||||
// bb: fb1.address.as_ptr().unwrap().cast(),
|
||||
bb: back_buffer.as_slice().as_ptr() as *mut u32,
|
||||
size: Size::new(fb1.width as u32, fb1.height as u32),
|
||||
color: Rgb888::WHITE,
|
||||
});
|
||||
log::info!("Graphics initialised");
|
||||
m
|
||||
});
|
||||
|
||||
pub fn init() {
|
||||
Lazy::force(&DISPLAY);
|
||||
}
|
||||
// pub fn virtio_gpu<T: Transport>(transport: T) {
|
||||
// let mut gpu = VirtIOGpu::<AbleosHal, T>::new(transport).expect("failed to create gpu driver");
|
||||
// let (width, height) = gpu.resolution().expect("failed to get resolution");
|
||||
// let width = width as usize;
|
||||
// let height = height as usize;
|
||||
// log::info!("GPU resolution is {}x{}", width, height);
|
||||
// let fb = gpu.setup_framebuffer().expect("failed to get fb");
|
||||
// for y in 0..height {
|
||||
// for x in 0..width {
|
||||
// let idx = (y * width + x) * 4;
|
||||
// fb[idx] = x as u8;
|
||||
// fb[idx + 1] = y as u8;
|
||||
// fb[idx + 2] = (x + y) as u8;
|
||||
// }
|
||||
// }
|
||||
// gpu.flush().expect("failed to flush");
|
||||
// //delay some time
|
||||
// log::info!("virtio-gpu show graphics....");
|
||||
// for _ in 0..100000 {
|
||||
// for _ in 0..100000 {
|
||||
// unsafe {
|
||||
// core::arch::asm!("nop");
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// log::info!("virtio-gpu test finished");
|
||||
// }
|
||||
|
|
|
@ -64,6 +64,8 @@ extern "x86-interrupt" fn page_fault(
|
|||
}
|
||||
|
||||
extern "x86-interrupt" fn timer(_isf: InterruptStackFrame) {
|
||||
// TODO: Pause the running program then schedule the next program
|
||||
|
||||
unsafe { LAPIC.lock().end_of_interrupt() };
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
//! Logging (as in terms of console / serial output)
|
||||
#![allow(deprecated)]
|
||||
|
||||
use {
|
||||
core::fmt::Write,
|
||||
limine::{TerminalRequest, TerminalResponse},
|
||||
|
@ -8,15 +9,43 @@ use {
|
|||
};
|
||||
|
||||
pub static SERIAL_CONSOLE: Mutex<SerialPort> = Mutex::new(unsafe { SerialPort::new(0x3F8) });
|
||||
static TERMINAL_LOGGER: Lazy<Mutex<TermLogger>> = Lazy::new(|| Mutex::new(TermLogger::new()));
|
||||
|
||||
pub fn init() {
|
||||
SERIAL_CONSOLE.lock().init();
|
||||
// Lazy::force(&TERMINAL_LOGGER);
|
||||
Lazy::force(&TERMINAL_LOGGER);
|
||||
}
|
||||
|
||||
pub fn log(args: core::fmt::Arguments<'_>) -> core::fmt::Result {
|
||||
x86_64::instructions::interrupts::without_interrupts(|| {
|
||||
// TERMINAL_LOGGER.lock().write_fmt(args)?;
|
||||
SERIAL_CONSOLE.lock().write_fmt(args)
|
||||
let mut sc = SERIAL_CONSOLE.lock();
|
||||
sc.write_fmt(args)?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
struct TermLogger(&'static TerminalResponse);
|
||||
unsafe impl Send for TermLogger {}
|
||||
impl TermLogger {
|
||||
pub fn new() -> Self {
|
||||
static TERM_REQ: TerminalRequest = TerminalRequest::new(0);
|
||||
Self(
|
||||
TERM_REQ
|
||||
.get_response()
|
||||
.get()
|
||||
.expect("failed to get terminal response"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl Write for TermLogger {
|
||||
fn write_str(&mut self, s: &str) -> core::fmt::Result {
|
||||
if let (Some(w), ts) = (self.0.write(), self.0.terminals()) {
|
||||
for term in ts {
|
||||
w(term, s);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
use {
|
||||
crate::bootmodules::BootModule, core::arch::asm, embedded_graphics::pixelcolor::Rgb888,
|
||||
log::warn, rdrand::RdSeed,
|
||||
};
|
||||
use embedded_graphics::pixelcolor::Rgb888;
|
||||
|
||||
use crate::{arch::x86_64::graphics::DISPLAY, bootmodules::BootModule};
|
||||
|
||||
pub mod memory;
|
||||
|
||||
mod cpuid;
|
||||
mod device_info_collector;
|
||||
mod gdt;
|
||||
pub mod graphics;
|
||||
pub(crate) mod interrupts;
|
||||
pub mod logging;
|
||||
pub mod pci;
|
||||
pub mod virtio;
|
||||
mod device_info_collector;
|
||||
|
||||
pub use {logging::log, memory::PAGE_SIZE};
|
||||
|
||||
|
@ -30,24 +30,7 @@ const INITIAL_KERNEL_HEAP_START: *mut u8 = _initial_kernel_heap_start as _;
|
|||
const INITIAL_KERNEL_HEAP_SIZE: *const () = _initial_kernel_heap_size as _;
|
||||
|
||||
#[no_mangle]
|
||||
#[naked]
|
||||
unsafe extern "C" fn _kernel_start() -> ! {
|
||||
// Initialise SSE and jump to kernel entrypoint
|
||||
core::arch::asm!(
|
||||
"mov rax, cr0",
|
||||
"and ax, 0xfffb",
|
||||
"or ax, 0x2",
|
||||
"mov cr0, rax",
|
||||
"mov rax, cr4",
|
||||
"or ax, 3 << 9",
|
||||
"mov cr4, rax",
|
||||
"jmp {}",
|
||||
sym start,
|
||||
options(noreturn),
|
||||
)
|
||||
}
|
||||
|
||||
unsafe extern "C" fn start() -> ! {
|
||||
logging::init();
|
||||
crate::logger::init().expect("failed to set logger");
|
||||
log::info!("Initialising AKern {}", crate::VERSION);
|
||||
|
@ -60,6 +43,7 @@ unsafe extern "C" fn start() -> ! {
|
|||
.expect("tried to get physical memory mapping offset from Limine")
|
||||
.offset,
|
||||
));
|
||||
|
||||
allocator::init(INITIAL_KERNEL_HEAP_START, INITIAL_KERNEL_HEAP_SIZE as _);
|
||||
|
||||
static MMAP_REQ: MemmapRequest = MemmapRequest::new(0);
|
||||
|
@ -80,56 +64,55 @@ unsafe extern "C" fn start() -> ! {
|
|||
device_info_collector::collect_device_info();
|
||||
|
||||
// Graphics test
|
||||
// {
|
||||
// graphics::init();
|
||||
// let mut dis = DISPLAY.lock();
|
||||
// use embedded_graphics::prelude::RgbColor;
|
||||
{
|
||||
graphics::init();
|
||||
let mut dis = DISPLAY.lock();
|
||||
use embedded_graphics::prelude::RgbColor;
|
||||
|
||||
// let _ = dis.set_color(Rgb888::YELLOW);
|
||||
// let thick = 6;
|
||||
// let p1 = (400, 30);
|
||||
// let p2 = (200, 150);
|
||||
// let p3 = (600, 150);
|
||||
// let p4 = (200, 350);
|
||||
// let p5 = (600, 350);
|
||||
// let p6 = (400, 470);
|
||||
let _ = dis.set_color(Rgb888::YELLOW);
|
||||
let thick = 6;
|
||||
let p1 = (400, 30);
|
||||
let p2 = (200, 150);
|
||||
let p3 = (600, 150);
|
||||
let p4 = (200, 350);
|
||||
let p5 = (600, 350);
|
||||
let p6 = (400, 470);
|
||||
|
||||
// {
|
||||
// //HEXAGON
|
||||
{
|
||||
//HEXAGON
|
||||
|
||||
// let _ = dis.line(p1.0, p1.1, p2.0, p2.1, thick);
|
||||
// let _ = dis.line(p1.0, p1.1, p3.0, p3.1, thick);
|
||||
// let _ = dis.line(p2.0, p2.1, p4.0, p4.1, thick);
|
||||
// let _ = dis.line(p3.0, p3.1, p5.0, p5.1, thick);
|
||||
// let _ = dis.line(p6.0, p6.1, p4.0, p4.1, thick);
|
||||
// let _ = dis.line(p6.0, p6.1, p5.0, p5.1, thick);
|
||||
// }
|
||||
// {
|
||||
// let _ = dis.line(600, 150, 200, 350, thick);
|
||||
// let _ = dis.line(600, 350, 400, 250, thick);
|
||||
// }
|
||||
let _ = dis.line(p1.0, p1.1, p2.0, p2.1, thick);
|
||||
let _ = dis.line(p1.0, p1.1, p3.0, p3.1, thick);
|
||||
let _ = dis.line(p2.0, p2.1, p4.0, p4.1, thick);
|
||||
let _ = dis.line(p3.0, p3.1, p5.0, p5.1, thick);
|
||||
let _ = dis.line(p6.0, p6.1, p4.0, p4.1, thick);
|
||||
let _ = dis.line(p6.0, p6.1, p5.0, p5.1, thick);
|
||||
}
|
||||
{
|
||||
let _ = dis.line(600, 150, 200, 350, thick);
|
||||
let _ = dis.line(600, 350, 400, 250, thick);
|
||||
}
|
||||
|
||||
// {
|
||||
// let _ = dis.set_color(Rgb888::WHITE);
|
||||
// let hp1 = (350, 150);
|
||||
// let hp2 = (350, 350);
|
||||
// let hp3 = (450, 250);
|
||||
// let hp4 = (350, 250);
|
||||
// let hp5 = (450, 150);
|
||||
// let hp6 = (450, 350);
|
||||
{
|
||||
let _ = dis.set_color(Rgb888::WHITE);
|
||||
let hp1 = (350, 150);
|
||||
let hp2 = (350, 350);
|
||||
let hp3 = (450, 250);
|
||||
let hp4 = (350, 250);
|
||||
let hp5 = (450, 150);
|
||||
let hp6 = (450, 350);
|
||||
|
||||
// let _ = dis.line(hp1.0, hp1.1, hp2.0, hp2.1, thick);
|
||||
// let _ = dis.line(hp3.0, hp3.1, hp4.0, hp4.1, thick);
|
||||
// let _ = dis.line(hp5.0, hp5.1, hp6.0, hp6.1, thick);
|
||||
// }
|
||||
let _ = dis.line(hp1.0, hp1.1, hp2.0, hp2.1, thick);
|
||||
let _ = dis.line(hp3.0, hp3.1, hp4.0, hp4.1, thick);
|
||||
let _ = dis.line(hp5.0, hp5.1, hp6.0, hp6.1, thick);
|
||||
}
|
||||
|
||||
// dis.swap_buffers();
|
||||
// };
|
||||
dis.swap_buffers();
|
||||
};
|
||||
|
||||
// TODO: Add in rdseed and rdrand as sources for randomness
|
||||
let _rand = xml::XMLElement::new("Random");
|
||||
|
||||
log::trace!("Getting boot modules");
|
||||
let bm = MOD_REQ.get_response().get();
|
||||
|
||||
let mut bootmodules = alloc::vec::Vec::new();
|
||||
|
@ -201,97 +184,11 @@ pub fn spin_loop() -> ! {
|
|||
|
||||
pub fn hardware_random_u64() -> u64 {
|
||||
use {log::trace, rdrand::RdRand};
|
||||
let gen = RdRand::new();
|
||||
match gen {
|
||||
Ok(gen) => {
|
||||
let ret = gen.try_next_u64().unwrap();
|
||||
trace!("Random {}", ret);
|
||||
return ret;
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("RDRand not supported.");
|
||||
// Try rdseed
|
||||
let gen = RdSeed::new();
|
||||
match gen {
|
||||
Ok(gen) => {
|
||||
let ret = gen.try_next_u64().unwrap();
|
||||
trace!("Random {}", ret);
|
||||
return ret;
|
||||
}
|
||||
Err(err) => {
|
||||
panic!("Neither RDRand or RDSeed are supported")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let gen = RdRand::new().unwrap();
|
||||
let ret = gen.try_next_u64().unwrap();
|
||||
trace!("Random {}", ret);
|
||||
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn get_edid() {}
|
||||
|
||||
pub fn register_dump() {
|
||||
let rax: u64;
|
||||
let rbx: u64 = 0;
|
||||
let rcx: u64;
|
||||
let rdx: u64;
|
||||
let si: u64;
|
||||
let di: u64;
|
||||
|
||||
let r8: u64; // TODO: r8-r15
|
||||
let r9: u64;
|
||||
let r10: u64;
|
||||
let r11: u64;
|
||||
let r12: u64;
|
||||
let r13: u64;
|
||||
let r14: u64;
|
||||
let r15: u64;
|
||||
|
||||
unsafe {
|
||||
asm!("",
|
||||
out("rax") rax,
|
||||
out("rcx") rcx,
|
||||
out("rdx") rdx,
|
||||
out("si") si,
|
||||
out("di") di,
|
||||
out("r8") r8,
|
||||
out("r9") r9,
|
||||
out("r10") r10,
|
||||
out("r11") r11,
|
||||
out("r12") r12,
|
||||
out("r13") r13,
|
||||
out("r14") r14,
|
||||
out("r15") r15,
|
||||
)
|
||||
};
|
||||
|
||||
log::error!(
|
||||
"Kernel Panic!\r
|
||||
Register Dump\r
|
||||
rax: {:#x}\r
|
||||
rbx: {:#x}\r
|
||||
rcx: {:#x}\r
|
||||
rdx: {:#x}\r
|
||||
si : {:#x}\r
|
||||
di : {:#x}\r
|
||||
r8 : {:#x}\r
|
||||
r9 : {:#x}\r
|
||||
r11: {:#x}\r
|
||||
r12: {:#x}\r
|
||||
r13: {:#x}\r
|
||||
r14: {:#x}\r
|
||||
r15: {:#x}\r
|
||||
",
|
||||
rax,
|
||||
rbx,
|
||||
rcx,
|
||||
rdx,
|
||||
si,
|
||||
di,
|
||||
r8,
|
||||
r9,
|
||||
r11,
|
||||
r12,
|
||||
r13,
|
||||
r14,
|
||||
r15,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,192 +0,0 @@
|
|||
//! Environment call handling routines
|
||||
|
||||
use core::borrow::Borrow;
|
||||
|
||||
use crate::{
|
||||
allocator,
|
||||
holeybytes::kernel_services::{
|
||||
block_read,
|
||||
service_definition_service::{sds_msg_handler, SERVICES},
|
||||
},
|
||||
};
|
||||
|
||||
use {
|
||||
super::{mem::Memory, Vm},
|
||||
crate::{arch, holeybytes::mem, ipc::buffer::IpcBuffer, kmain::IPC_BUFFERS},
|
||||
alloc::string::String,
|
||||
log::{debug, error, info, trace, warn},
|
||||
};
|
||||
|
||||
pub fn handler(vm: &mut Vm) {
|
||||
let r1 = vm.registers[1].cast::<u64>();
|
||||
|
||||
// debug!("Ecall number {:?}", r1);
|
||||
// trace!("Register dump: {:?}", vm.registers);
|
||||
|
||||
match r1 {
|
||||
0 => {
|
||||
// TODO: explode computer
|
||||
// hello world ecall
|
||||
for x in 0u64..=255 {
|
||||
vm.registers[x as usize] = x.into();
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
// Make buffer
|
||||
|
||||
let bounded = match vm.registers[2].cast::<u64>() {
|
||||
0 => false,
|
||||
1 => true,
|
||||
_ => {
|
||||
panic!("Bad");
|
||||
}
|
||||
};
|
||||
|
||||
let length = vm.registers[3].cast::<u64>();
|
||||
|
||||
let mut buffs = IPC_BUFFERS.lock();
|
||||
let abc;
|
||||
|
||||
match bounded {
|
||||
false => {
|
||||
abc = IpcBuffer::new(false, 0);
|
||||
}
|
||||
true => {
|
||||
abc = IpcBuffer::new(true, length);
|
||||
}
|
||||
};
|
||||
let buff_id = arch::hardware_random_u64();
|
||||
buffs.insert(buff_id, abc);
|
||||
debug!("Buffer ID: {}", buff_id);
|
||||
vm.registers[1] = hbvm::value::Value(buff_id);
|
||||
}
|
||||
2 => {
|
||||
// Delete buffer
|
||||
}
|
||||
3 => {
|
||||
// Send a message to a buffer
|
||||
let r2 = vm.registers[2].cast::<u64>();
|
||||
let r3 = vm.registers[3].cast::<u64>();
|
||||
let r4 = vm.registers[4].cast::<u64>();
|
||||
|
||||
let buffer_id = r2;
|
||||
let mem_addr = r3;
|
||||
let length = r4 as usize;
|
||||
trace!("IPC address: {:?}", mem_addr);
|
||||
use alloc::vec::Vec;
|
||||
|
||||
match buffer_id {
|
||||
0 => match sds_msg_handler(vm, mem_addr, length) {
|
||||
Ok(()) => {}
|
||||
Err(err) => log::error!("Improper sds format"),
|
||||
},
|
||||
1 => match log_msg_handler(vm, mem_addr, length) {
|
||||
Ok(()) => {}
|
||||
Err(err) => log::error!("Improper log format"),
|
||||
},
|
||||
2 => {
|
||||
use crate::holeybytes::kernel_services::mem_serve::memory_msg_handler;
|
||||
match memory_msg_handler(vm, mem_addr, length) {
|
||||
Ok(_) => {}
|
||||
Err(_) => {}
|
||||
}
|
||||
//
|
||||
}
|
||||
buffer_id => {
|
||||
let mut buffs = IPC_BUFFERS.lock();
|
||||
|
||||
match buffs.get_mut(&buffer_id) {
|
||||
Some(buff) => {
|
||||
let mut msg_vec = vec![];
|
||||
|
||||
for x in 0..(length as isize) {
|
||||
let xyz = mem_addr as *const u8;
|
||||
let value = unsafe { xyz.offset(x).read() };
|
||||
msg_vec.push(value);
|
||||
}
|
||||
buff.push(msg_vec.clone());
|
||||
info!(
|
||||
"Message {:?} has been sent to Buffer({})",
|
||||
msg_vec, buffer_id
|
||||
);
|
||||
}
|
||||
None => {
|
||||
log::error!("Access of non-existent buffer {}", buffer_id)
|
||||
}
|
||||
}
|
||||
drop(buffs);
|
||||
}
|
||||
}
|
||||
}
|
||||
4 => {
|
||||
let r2 = vm.registers[2].cast::<u64>();
|
||||
|
||||
let mut buffs = IPC_BUFFERS.lock();
|
||||
let mut buff = buffs.get_mut(&r2).unwrap();
|
||||
let msg = buff.pop();
|
||||
info!("Recieve {:?} from Buffer({})", msg, r2);
|
||||
}
|
||||
5 => {
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
{
|
||||
let r2 = vm.registers[2].cast::<u64>();
|
||||
unsafe fn x86_in(address: u16) -> u32 {
|
||||
x86_64::instructions::port::Port::new(address).read()
|
||||
}
|
||||
unsafe fn x86_out(address: u16, value: u32) {
|
||||
x86_64::instructions::port::Port::new(address).write(value);
|
||||
}
|
||||
vm.registers[3] = hbvm::value::Value(unsafe { x86_in(r2 as u16) } as u64);
|
||||
}
|
||||
}
|
||||
// 5
|
||||
_ => {
|
||||
log::error!("Syscall unknown {:?}{:?}", r1, vm.registers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn log_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
// let message_length = 8 + 8 + 8;
|
||||
// log::info!("Mem Addr 0x{:x?} length {}", mem_addr, length);
|
||||
let mut msg_vec = block_read(mem_addr, length);
|
||||
|
||||
let log_level = msg_vec.pop().unwrap();
|
||||
match String::from_utf8(msg_vec) {
|
||||
Ok(strr) => {
|
||||
// use LogLevel::*;
|
||||
let ll = match log_level {
|
||||
0 | 48 => error!("{}", strr),
|
||||
1 | 49 => warn!("{}", strr),
|
||||
2 | 50 => info!("{}", strr),
|
||||
3 | 51 => debug!("{}", strr),
|
||||
4 | 52 => trace!("{}", strr),
|
||||
_ => {
|
||||
return Err(LogError::InvalidLogFormat);
|
||||
}
|
||||
};
|
||||
}
|
||||
Err(e) => {
|
||||
error!("{:?}", e);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum LogError {
|
||||
InvalidLogFormat,
|
||||
}
|
||||
use {alloc::vec, log::Record};
|
||||
|
||||
// fn memory_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
// let mut val = alloc::vec::Vec::new();
|
||||
// for _ in 0..4096 {
|
||||
// val.push(0);
|
||||
// }
|
||||
// info!("Block address: {:?}", val.as_ptr());
|
||||
// vm.registers[1] = hbvm::value::Value(val.as_ptr() as u64);
|
||||
// vm.registers[2] = hbvm::value::Value(4096);
|
||||
// Ok(())
|
||||
// }
|
|
@ -1,22 +0,0 @@
|
|||
enum MemoryServiceResult {
|
||||
|
||||
}
|
||||
|
||||
@alignment(4096)
|
||||
type PageAlignedPointer = pointer;
|
||||
|
||||
type RID = u64;
|
||||
|
||||
|
||||
|
||||
@nonexhaustive
|
||||
@version 1.0
|
||||
protocol MemoryService {
|
||||
@validator(page_count, Range(1..16))
|
||||
fn map_pages(page_count: u8, ptr: Optional<PageAlignedPointer>) -> MemoryServiceResult;
|
||||
fn unmap_pages(ptr: PageAlignedPointer) -> MemoryServiceResult;
|
||||
// ptr must be page aligned and already mapped from map_pages
|
||||
fn map_hardware(hw: RID, ptr: PageAlignedPointer) -> MemoryServiceResult;
|
||||
fn unmap_hardware(hw: RID) -> MemoryServiceResult;
|
||||
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
use {
|
||||
crate::holeybytes::{
|
||||
ecah::LogError,
|
||||
kernel_services::{block_read, mem_serve},
|
||||
Vm,
|
||||
},
|
||||
alloc::alloc::alloc_zeroed,
|
||||
log::{debug, info},
|
||||
};
|
||||
|
||||
pub enum MemoryServiceError {
|
||||
InvalidMemoryFormat,
|
||||
}
|
||||
#[derive(Debug)]
|
||||
pub enum MemoryQuotaType {
|
||||
NoQuota = 0,
|
||||
SoftQuota = 1,
|
||||
HardQuota = 2,
|
||||
KillQuota = 3,
|
||||
}
|
||||
|
||||
fn alloc_page(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), MemoryServiceError> {
|
||||
let mut val = alloc::vec::Vec::new();
|
||||
for _ in 0..4096 {
|
||||
val.push(0);
|
||||
}
|
||||
info!("Block address: {:?}", val.as_ptr());
|
||||
vm.registers[1] = hbvm::value::Value(val.as_ptr() as u64);
|
||||
vm.registers[2] = hbvm::value::Value(4096);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn memory_msg_handler(
|
||||
vm: &mut Vm,
|
||||
mem_addr: u64,
|
||||
length: usize,
|
||||
) -> Result<(), MemoryServiceError> {
|
||||
let mut msg_vec = block_read(mem_addr, length);
|
||||
let msg_type = msg_vec[0];
|
||||
msg_vec.remove(0);
|
||||
match msg_type {
|
||||
0 => {
|
||||
let page_count = msg_vec[0];
|
||||
msg_vec.remove(0);
|
||||
|
||||
// let mptr_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap();
|
||||
// let mptr: u64 = u64::from_le_bytes(mptr_raw);
|
||||
|
||||
// log::debug!("Allocating {} pages @ {}", page_count, mptr);
|
||||
|
||||
let mut val = alloc::vec::Vec::new();
|
||||
for _ in 0..(page_count as isize * 4096) {
|
||||
val.push(0);
|
||||
}
|
||||
vm.registers[1] = hbvm::value::Value(val.as_ptr() as u64);
|
||||
}
|
||||
1 => {
|
||||
let page_count = msg_vec[0];
|
||||
msg_vec.remove(0);
|
||||
}
|
||||
2 => {
|
||||
use MemoryQuotaType::*;
|
||||
let quota_type = match msg_vec[0] {
|
||||
0 => NoQuota,
|
||||
1 => SoftQuota,
|
||||
2 => HardQuota,
|
||||
3 => KillQuota,
|
||||
_ => NoQuota,
|
||||
};
|
||||
msg_vec.remove(0);
|
||||
let hid_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap();
|
||||
let hid: u64 = u64::from_le_bytes(hid_raw);
|
||||
for _ in 0..8 {
|
||||
msg_vec.remove(0);
|
||||
}
|
||||
|
||||
let pid_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap();
|
||||
let pid: u64 = u64::from_le_bytes(hid_raw);
|
||||
for _ in 0..8 {
|
||||
msg_vec.remove(0);
|
||||
}
|
||||
|
||||
debug!(
|
||||
"Setting HID-{:x}:PID-{:x}'s quota type to {:?}",
|
||||
hid, pid, quota_type
|
||||
)
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
use alloc::{vec, vec::Vec};
|
||||
|
||||
pub mod mem_serve;
|
||||
pub mod service_definition_service;
|
||||
|
||||
pub fn block_read(mem_addr: u64, length: usize) -> Vec<u8> {
|
||||
let mut msg_vec = vec![];
|
||||
|
||||
for x in 0..(length as isize) {
|
||||
let xyz = mem_addr as *const u8;
|
||||
let value = unsafe { xyz.offset(x).read() };
|
||||
msg_vec.push(value);
|
||||
}
|
||||
msg_vec
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
use {
|
||||
crate::{
|
||||
alloc::string::ToString,
|
||||
arch::hardware_random_u64,
|
||||
holeybytes::{ecah::LogError, kernel_services::block_read, Vm},
|
||||
ipc::{protocol, protocol::Protocol},
|
||||
},
|
||||
alloc::string::String,
|
||||
hashbrown::HashMap,
|
||||
log::info,
|
||||
spin::{lazy::Lazy, Mutex},
|
||||
};
|
||||
pub struct Services(HashMap<u64, Protocol>);
|
||||
pub static SERVICES: Lazy<Mutex<Services>> = Lazy::new(|| {
|
||||
let mut dt = Services(HashMap::new());
|
||||
dt.0.insert(0, Protocol::void());
|
||||
Mutex::new(dt)
|
||||
});
|
||||
|
||||
pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
let mut msg_vec = block_read(mem_addr, length);
|
||||
let sds_event_type: ServiceEventType = msg_vec[0].into();
|
||||
msg_vec.remove(0);
|
||||
|
||||
use ServiceEventType::*;
|
||||
match sds_event_type {
|
||||
CreateService => {
|
||||
let string = String::from_utf8(msg_vec).expect("Our bytes should be valid utf8");
|
||||
sds_create_service(string);
|
||||
}
|
||||
DeleteService => todo!(),
|
||||
SearchServices => todo!(),
|
||||
}
|
||||
// let buffer_id_raw = &msg_vec[0..8];
|
||||
// let mut arr = [0u8; 8];
|
||||
// arr.copy_from_slice(&buffer_id_raw);
|
||||
// let buffer_id = u64::from_le_bytes(arr);
|
||||
// info!("BufferID({:x?})", buffer_id);
|
||||
|
||||
// let mut services = SERVICES.lock();
|
||||
// let string = String::from_utf8(msg_vec).expect("Our bytes should be valid utf8");
|
||||
// use core::borrow::BorrowMut;
|
||||
// services.borrow_mut().0.insert(buffer_id, string);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
enum ServiceEventType {
|
||||
CreateService = 0,
|
||||
// UpdateService = 1,
|
||||
DeleteService = 2,
|
||||
SearchServices = 3,
|
||||
}
|
||||
impl From<u8> for ServiceEventType {
|
||||
fn from(value: u8) -> Self {
|
||||
use self::*;
|
||||
match value {
|
||||
0 => Self::CreateService,
|
||||
// 1 =>
|
||||
2 => Self::DeleteService,
|
||||
3 => Self::SearchServices,
|
||||
1_u8 | 4_u8..=u8::MAX => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn sds_create_service(protocol: String) -> u64 {
|
||||
let buff_id = hardware_random_u64();
|
||||
let mut services = SERVICES.lock();
|
||||
services.0.insert(buff_id, protocol.clone().into());
|
||||
info!("BufferID({}) => {}", buff_id, protocol);
|
||||
let a: protocol::Protocol = protocol.into();
|
||||
buff_id
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
//! Security? Multiple address spaces? What are you talking about
|
||||
//! young adventurer. In this temple, we know no such words.
|
||||
//!
|
||||
//! Want your program to override other program's data or even the
|
||||
//! data of the kernel itself? Sure. This right shall not be infringed.
|
||||
|
||||
use hbvm::mem::Address;
|
||||
|
||||
fn calc_start_of_page(ptr: u64) -> u64 {
|
||||
let mut page_aligned = false;
|
||||
if ptr % 4096 == 0 {
|
||||
// page_aligned = true;
|
||||
return ptr / 4096;
|
||||
}
|
||||
panic!("unaligned");
|
||||
}
|
||||
|
||||
pub struct Memory {
|
||||
// TODO: map page aligned segments of memory into a table or some sort here
|
||||
}
|
||||
|
||||
impl Memory {
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
fn read_device(addr: Address) {
|
||||
unsafe {
|
||||
//
|
||||
// x86_64::instructions::port::Port::new(addr.get()).read()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl hbvm::mem::Memory for Memory {
|
||||
#[inline]
|
||||
unsafe fn load(
|
||||
&mut self,
|
||||
addr: Address,
|
||||
target: *mut u8,
|
||||
count: usize,
|
||||
) -> Result<(), hbvm::mem::LoadError> {
|
||||
use log::{error, info};
|
||||
if addr.get() % 4096 == 0 {}
|
||||
core::ptr::copy(addr.get() as *const u8, target, count);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn store(
|
||||
&mut self,
|
||||
addr: Address,
|
||||
source: *const u8,
|
||||
count: usize,
|
||||
) -> Result<(), hbvm::mem::StoreError> {
|
||||
core::ptr::copy(source, addr.get() as *mut u8, count);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn prog_read<T: Copy>(&mut self, addr: Address) -> T {
|
||||
(addr.get() as *const T).read_unaligned()
|
||||
}
|
||||
}
|
|
@ -1,123 +0,0 @@
|
|||
mod ecah;
|
||||
mod kernel_services;
|
||||
mod mem;
|
||||
|
||||
use {
|
||||
crate::{arch, ipc::buffer::IpcBuffer, kmain::IPC_BUFFERS},
|
||||
alloc::boxed::Box,
|
||||
core::{default, future::Future, marker::PhantomData, ptr::NonNull, task::Poll},
|
||||
hbvm::{
|
||||
mem::{
|
||||
softpaging::{icache::ICache, HandlePageFault, SoftPagedMem},
|
||||
Address, Memory,
|
||||
},
|
||||
VmRunError, VmRunOk,
|
||||
},
|
||||
log::{debug, error, info, trace, warn},
|
||||
};
|
||||
|
||||
const STACK_SIZE: usize = 1024 * 1024;
|
||||
const TIMER_QUOTIENT: usize = 100;
|
||||
type Vm = hbvm::Vm<mem::Memory, TIMER_QUOTIENT>;
|
||||
|
||||
pub struct ExecThread<'p> {
|
||||
vm: Vm,
|
||||
stack_bottom: *mut u8,
|
||||
_phantom: PhantomData<&'p [u8]>,
|
||||
}
|
||||
|
||||
unsafe impl<'p> Send for ExecThread<'p> {}
|
||||
impl<'p> ExecThread<'p> {
|
||||
pub fn set_arguments(&mut self, ptr: u64, length: u64) {
|
||||
self.vm.registers[1] = hbvm::value::Value(ptr);
|
||||
self.vm.registers[2] = hbvm::value::Value(length);
|
||||
}
|
||||
|
||||
pub unsafe fn new(program: &'p [u8], entrypoint: Address) -> Self {
|
||||
let mut vm = unsafe {
|
||||
Vm::new(
|
||||
mem::Memory {},
|
||||
Address::new(program.as_ptr() as u64 + entrypoint.get()),
|
||||
)
|
||||
};
|
||||
|
||||
let stack_bottom = unsafe { allocate_stack().as_ptr() };
|
||||
vm.write_reg(254, (stack_bottom as usize + STACK_SIZE - 1) as u64);
|
||||
|
||||
ExecThread {
|
||||
vm,
|
||||
stack_bottom,
|
||||
_phantom: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'p> Drop for ExecThread<'p> {
|
||||
fn drop(&mut self) {
|
||||
unsafe { alloc::alloc::dealloc(self.stack_bottom, stack_layout()) };
|
||||
}
|
||||
}
|
||||
|
||||
impl<'p> Future for ExecThread<'p> {
|
||||
type Output = Result<(), VmRunError>;
|
||||
|
||||
fn poll(
|
||||
mut self: core::pin::Pin<&mut Self>,
|
||||
cx: &mut core::task::Context<'_>,
|
||||
) -> Poll<Self::Output> {
|
||||
match self.vm.run() {
|
||||
Err(err) => {
|
||||
log::error!("HBVM Error\r\nRegister dump: {:?}", self.vm.registers,);
|
||||
return Poll::Ready(Err(err));
|
||||
}
|
||||
Ok(VmRunOk::End) => return Poll::Ready(Ok(())),
|
||||
Ok(VmRunOk::Ecall) => ecah::handler(&mut self.vm),
|
||||
Ok(VmRunOk::Timer) => (),
|
||||
Ok(VmRunOk::Breakpoint) => {
|
||||
log::error!(
|
||||
"HBVM Debug breakpoint\r\nRegister dump: {:?}",
|
||||
self.vm.registers,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
cx.waker().wake_by_ref();
|
||||
Poll::Pending
|
||||
}
|
||||
}
|
||||
|
||||
struct PageFaultHandler;
|
||||
impl HandlePageFault for PageFaultHandler {
|
||||
fn page_fault(
|
||||
&mut self,
|
||||
reason: hbvm::mem::MemoryAccessReason,
|
||||
pagetable: &mut hbvm::mem::softpaging::paging::PageTable,
|
||||
vaddr: hbvm::mem::Address,
|
||||
size: hbvm::mem::softpaging::PageSize,
|
||||
dataptr: *mut u8,
|
||||
) -> bool
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
log::error!(
|
||||
"REASON: {reason} \
|
||||
vaddr: {vaddr} \
|
||||
size: {size:?} \
|
||||
Dataptr {dataptr:p}",
|
||||
);
|
||||
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
const fn stack_layout() -> core::alloc::Layout {
|
||||
unsafe { alloc::alloc::Layout::from_size_align_unchecked(STACK_SIZE, 4096) }
|
||||
}
|
||||
|
||||
fn allocate_stack() -> NonNull<u8> {
|
||||
let layout = stack_layout();
|
||||
match NonNull::new(unsafe { alloc::alloc::alloc_zeroed(layout) }) {
|
||||
Some(ptr) => ptr,
|
||||
None => alloc::alloc::handle_alloc_error(layout),
|
||||
}
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
//! the system interface
|
||||
|
||||
// use {
|
||||
// crate::ipc::message::Message,
|
||||
// alloc::vec::Vec,
|
||||
// crossbeam_queue::{ArrayQueue, SegQueue},
|
||||
// // hbvm::engine::Engine,
|
||||
// log::trace,
|
||||
// HostError::MemoryError,
|
||||
// };
|
||||
/// Host errors
|
||||
pub enum HostError {
|
||||
/// A host memory error
|
||||
MemoryError,
|
||||
}
|
||||
|
||||
// / Check f0 register for the handle
|
||||
// / check f1 for the message ptr
|
||||
// / check f2 for the message length
|
||||
// pub fn ipc_send(engine: &mut Engine) -> Result<(), HostError> {
|
||||
// let _handle = engine.registers.f0;
|
||||
// let message_start = engine.registers.f1;
|
||||
// let message_length = engine.registers.f2;
|
||||
|
||||
// let mut ipc_msg: Vec<u8> = alloc::vec![];
|
||||
|
||||
// for x in message_start..message_start + message_length {
|
||||
// let byte = engine.read_mem_addr_8(x);
|
||||
// match byte {
|
||||
// Ok(byte) => ipc_msg.push(byte),
|
||||
// Err(_) => return Err(MemoryError),
|
||||
// }
|
||||
// }
|
||||
// log::trace!("Message bytes {:?}", ipc_msg);
|
||||
// Ok(())
|
||||
// }
|
||||
|
||||
// // pub fn ipc_recv(_engine: &mut Engine) {}
|
||||
|
||||
// /// Check f0 for the buffer type
|
||||
// /// 0 means an unbound buffer
|
||||
// /// 1 means a bound buffer
|
||||
// /// Check f1 if the buffer is bound
|
||||
// ///
|
||||
// /// f2 Return a handle to the sender
|
||||
// /// f3 returns a handle the the reciever
|
||||
// pub fn ipc_mkbuf(engine: &mut Engine) {
|
||||
// match engine.registers.f0 as usize {
|
||||
// 0 => {
|
||||
// trace!("Making a new ipc unbound buffer");
|
||||
// let _buf: SegQueue<Message> = SegQueue::new();
|
||||
// }
|
||||
// 1 => {
|
||||
// let buf_len = engine.registers.f1 as usize;
|
||||
// trace!("Making a new ipc buffer with capacity {}", buf_len);
|
||||
// let _buf: ArrayQueue<Message> = ArrayQueue::new(buf_len);
|
||||
// }
|
||||
// _ => {}
|
||||
// }
|
||||
// }
|
||||
|
||||
// // pub fn rpc_discover(_engine: &mut Engine) {}
|
||||
// // pub fn rpc_register(_engine: &mut Engine) {}
|
||||
// // pub fn rpc_call(_engine: &mut Engine) {}
|
||||
|
||||
use {hbvm::vm::mem::HandlePageFault, log::error};
|
||||
/// AbleOS HBVM traphandler
|
||||
pub struct TrapHandler;
|
||||
impl HandlePageFault for TrapHandler {
|
||||
fn page_fault(
|
||||
&mut self,
|
||||
reason: hbvm::vm::mem::MemoryAccessReason,
|
||||
memory: &mut hbvm::vm::mem::Memory,
|
||||
vaddr: u64,
|
||||
size: hbvm::vm::mem::PageSize,
|
||||
dataptr: *mut u8,
|
||||
) -> bool {
|
||||
error!(
|
||||
"REASON: {}
|
||||
memory: {:?}
|
||||
vaddr: {}
|
||||
size: {:?}
|
||||
Dataptr {:?}",
|
||||
reason, memory, vaddr, size, dataptr
|
||||
);
|
||||
false
|
||||
}
|
||||
}
|
|
@ -1,73 +1,42 @@
|
|||
//!
|
||||
|
||||
use {
|
||||
super::{message::Message, protocol::Protocol},
|
||||
super::message::Message,
|
||||
crossbeam_queue::{ArrayQueue, SegQueue},
|
||||
};
|
||||
pub enum BufferTypes {
|
||||
|
||||
enum BufferTypes {
|
||||
Unbound(SegQueue<Message>),
|
||||
Bound(ArrayQueue<Message>),
|
||||
}
|
||||
/// Interproccess buffer
|
||||
pub struct IpcBuffer {
|
||||
pub protocol: Protocol,
|
||||
pub buffer: BufferTypes,
|
||||
protocol: Protocol,
|
||||
buffer: BufferTypes,
|
||||
}
|
||||
|
||||
impl IpcBuffer {
|
||||
pub fn new(bounded: bool, length: u64) -> Self {
|
||||
log::debug!(
|
||||
"New IPCBuffer\r
|
||||
bounded: {}\r
|
||||
length: {:?}\r",
|
||||
bounded,
|
||||
length
|
||||
);
|
||||
|
||||
match (bounded, length) {
|
||||
(false, a) => {
|
||||
let buftype = BufferTypes::Unbound(SegQueue::new());
|
||||
|
||||
Self {
|
||||
protocol: Protocol::void(),
|
||||
buffer: buftype,
|
||||
}
|
||||
}
|
||||
(true, length) => {
|
||||
let buftype = BufferTypes::Bound(ArrayQueue::new(length as usize));
|
||||
Self {
|
||||
protocol: Protocol::void(),
|
||||
buffer: buftype,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Validate a message to match the `IPC.protocol`
|
||||
pub fn validate_messages(&mut self) -> Result<(), IpcError> {
|
||||
Ok(())
|
||||
}
|
||||
pub fn push(&mut self, msg: Message) {
|
||||
match &self.buffer {
|
||||
BufferTypes::Unbound(buff) => buff.push(msg.clone()),
|
||||
BufferTypes::Bound(buff) => {
|
||||
let _ = buff.push(msg.clone());
|
||||
}
|
||||
};
|
||||
}
|
||||
pub fn pop(&mut self) -> Message {
|
||||
let msg = match &self.buffer {
|
||||
BufferTypes::Unbound(buff) => buff.pop(),
|
||||
BufferTypes::Bound(buff) => buff.pop(),
|
||||
};
|
||||
match msg {
|
||||
Some(msg) => return msg,
|
||||
None => panic!("Recieving msg error. No messages!"),
|
||||
}
|
||||
}
|
||||
}
|
||||
/// Interprocess Communication Errors
|
||||
pub enum IpcError {
|
||||
/// An invalid message error returned to the sender
|
||||
InvalidMessage,
|
||||
}
|
||||
|
||||
/// TODO: define this, possibly as the binary form of the IDL
|
||||
/// DEPEND: This depends on an IDL
|
||||
pub struct Protocol {
|
||||
// TODO: add in settings
|
||||
// like `invalid_message_handler` with some options similar to
|
||||
// `Deny` Drops the message
|
||||
// `Allow` Allows invalid messages (This disables validators IPC side and relies on programs to handle invalid messages)
|
||||
// `CustomFunct` a callback
|
||||
// and `report_invalid_messages_to_sender`
|
||||
// `True`
|
||||
// `False`
|
||||
// settings: PSettings,
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
//! Interprocess communication
|
||||
pub mod buffer;
|
||||
pub mod message;
|
||||
pub mod protocol;
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
use {
|
||||
alloc::{string::String, vec::Vec},
|
||||
hashbrown::HashMap,
|
||||
log::info,
|
||||
};
|
||||
|
||||
pub struct Type {}
|
||||
pub struct Funct {
|
||||
takes: Vec<String>,
|
||||
gives: Vec<String>,
|
||||
}
|
||||
|
||||
pub struct Protocol {
|
||||
types: HashMap<String, Type>,
|
||||
fns: HashMap<String, Funct>,
|
||||
}
|
||||
impl Protocol {
|
||||
pub fn void() -> Self {
|
||||
Self {
|
||||
types: HashMap::new(),
|
||||
fns: HashMap::new(),
|
||||
}
|
||||
}
|
||||
// Check if a protocol defines all types it needs too
|
||||
fn validate_protocol() -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl From<String> for Protocol {
|
||||
fn from(value: alloc::string::String) -> Self {
|
||||
if value.starts_with("protocol") {
|
||||
info!("ABC");
|
||||
}
|
||||
Self {
|
||||
types: HashMap::new(),
|
||||
fns: HashMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,18 +1,13 @@
|
|||
//! AbleOS Kernel Entrypoint
|
||||
|
||||
// use crate::arch::sloop;
|
||||
use {
|
||||
crate::{
|
||||
arch::{hardware_random_u64, logging::SERIAL_CONSOLE},
|
||||
bootmodules::{build_cmd, BootModules},
|
||||
capabilities,
|
||||
device_tree::DeviceTree,
|
||||
holeybytes::ExecThread,
|
||||
ipc::buffer::{self, IpcBuffer},
|
||||
scheduler::Scheduler,
|
||||
},
|
||||
alloc::format,
|
||||
hashbrown::HashMap,
|
||||
hbvm::mem::Address,
|
||||
limine::{Framebuffer, FramebufferRequest, NonNullPtr},
|
||||
log::{debug, info, trace},
|
||||
spin::{Lazy, Mutex},
|
||||
xml::XMLElement,
|
||||
|
@ -21,105 +16,42 @@ use {
|
|||
pub fn kmain(cmdline: &str, boot_modules: BootModules) -> ! {
|
||||
debug!("Entered kmain");
|
||||
|
||||
let kcmd = build_cmd("Kernel Command Line", cmdline);
|
||||
let kcmd = build_cmd("Kernel Command Line", &cmdline);
|
||||
trace!("Cmdline: {kcmd:?}");
|
||||
|
||||
// for (i, bm) in boot_modules.iter().enumerate() {
|
||||
// let name = format!("module-{}", i);
|
||||
// let _bmcmd: XMLElement;
|
||||
// if bm.cmd.len() >= 2 {
|
||||
// // TODO: pass into the program
|
||||
// // Pass CMDLine into an IPCBuffer and put the ptr to the IPCBuffer in r200
|
||||
// _bmcmd = build_cmd(name, bm.cmd.clone());
|
||||
// log::info!("{:?}", _bmcmd);
|
||||
// }
|
||||
// }
|
||||
for (i, bm) in boot_modules.iter().enumerate() {
|
||||
let name = format!("module-{}", i);
|
||||
let _bmcmd: XMLElement;
|
||||
if bm.cmd.len() >= 2 {
|
||||
// TODO: pass into the program
|
||||
_bmcmd = build_cmd(name, bm.cmd.clone());
|
||||
}
|
||||
}
|
||||
|
||||
let dt = DEVICE_TREE.lock();
|
||||
|
||||
// TODO(Able): This line causes a deadlock
|
||||
info!("Device Tree: {}", dt);
|
||||
|
||||
info!("Boot complete. Moving to init_system");
|
||||
|
||||
// TODO: schedule the disk driver from the initramfs
|
||||
// TODO: schedule the filesystem driver from the initramfs
|
||||
// TODO: Schedule the VFS from initramfs
|
||||
// TODO: schedule the init system from the initramfs
|
||||
|
||||
drop(dt);
|
||||
// capabilities::example();
|
||||
|
||||
let fb1: &NonNullPtr<Framebuffer> = &FB_REQ.get_response().get().unwrap().framebuffers()[0];
|
||||
let mut sched = Scheduler::new();
|
||||
|
||||
{
|
||||
use crate::alloc::string::ToString;
|
||||
let mut dt = DEVICE_TREE.lock();
|
||||
let mut disp = xml::XMLElement::new("display_0");
|
||||
sched.new_process(boot_modules[0].bytes.clone());
|
||||
sched.new_process(boot_modules[1].bytes.clone());
|
||||
|
||||
disp.set_attribute("width", fb1.width);
|
||||
disp.set_attribute("height", fb1.height);
|
||||
disp.set_attribute("bits per pixel", fb1.bpp);
|
||||
disp.set_attribute("pitch", fb1.pitch);
|
||||
dt.devices.insert("Displays".to_string(), alloc::vec![disp]);
|
||||
}
|
||||
log::info!("Graphics initialised");
|
||||
log::info!(
|
||||
"Graphics front ptr {:?}",
|
||||
fb1.address.as_ptr().unwrap() as *const u8
|
||||
);
|
||||
|
||||
let mut executor = crate::task::Executor::default();
|
||||
let bm_take = boot_modules.len();
|
||||
unsafe {
|
||||
for module in boot_modules.into_iter().take(bm_take) {
|
||||
let mut cmd = module.cmd;
|
||||
if cmd.len() > 2 {
|
||||
// Remove the quotes
|
||||
cmd.remove(0);
|
||||
cmd.pop();
|
||||
}
|
||||
let cmd_len = cmd.as_bytes().len() as u64;
|
||||
|
||||
log::info!("Spawning {} with arguments \"{}\"", module.path, cmd);
|
||||
|
||||
executor.spawn(async move {
|
||||
let mut thr = ExecThread::new(&module.bytes, Address::new(0));
|
||||
if cmd_len > 0 {
|
||||
thr.set_arguments(cmd.as_bytes().as_ptr() as u64, cmd_len);
|
||||
}
|
||||
|
||||
if let Err(e) = thr.await {
|
||||
log::error!("{e:?}");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
info!("Random number: {}", hardware_random_u64());
|
||||
|
||||
executor.run();
|
||||
};
|
||||
|
||||
crate::arch::spin_loop()
|
||||
sched.run();
|
||||
// spin_loop();
|
||||
}
|
||||
|
||||
pub static DEVICE_TREE: Lazy<Mutex<DeviceTree>> = Lazy::new(|| {
|
||||
let dt = DeviceTree::new();
|
||||
Mutex::new(dt)
|
||||
});
|
||||
pub static FB_REQ: FramebufferRequest = FramebufferRequest::new(0);
|
||||
|
||||
use alloc::vec::Vec;
|
||||
pub type IpcBuffers = HashMap<u64, IpcBuffer>;
|
||||
pub static IPC_BUFFERS: Lazy<Mutex<IpcBuffers>> = Lazy::new(|| {
|
||||
let mut bufs = HashMap::new();
|
||||
let log_buffer = IpcBuffer::new(false, 0);
|
||||
let file_buffer = IpcBuffer::new(false, 0);
|
||||
|
||||
bufs.insert(1, log_buffer);
|
||||
bufs.insert(2, file_buffer);
|
||||
|
||||
Mutex::new(bufs)
|
||||
});
|
||||
|
||||
#[test_case]
|
||||
fn trivial_assertion() {
|
||||
|
|
|
@ -9,27 +9,29 @@
|
|||
inline_const,
|
||||
panic_info_message,
|
||||
pointer_is_aligned,
|
||||
prelude_import,
|
||||
ptr_sub_ptr,
|
||||
custom_test_frameworks,
|
||||
naked_functions,
|
||||
custom_test_frameworks
|
||||
)]
|
||||
#![deny(clippy::pedantic, missing_docs, warnings)]
|
||||
#![allow(dead_code)]
|
||||
#![test_runner(crate::test_runner)]
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
mod allocator;
|
||||
mod arch;
|
||||
mod bootmodules;
|
||||
mod capabilities;
|
||||
mod device_tree;
|
||||
mod handle;
|
||||
mod holeybytes;
|
||||
mod ipc;
|
||||
pub mod capabilities;
|
||||
pub mod device_tree;
|
||||
pub mod handle;
|
||||
pub mod host;
|
||||
pub mod ipc;
|
||||
mod kmain;
|
||||
mod logger;
|
||||
mod memory;
|
||||
mod task;
|
||||
mod utils;
|
||||
mod scheduler;
|
||||
pub mod utils;
|
||||
|
||||
use versioning::Version;
|
||||
|
||||
|
@ -42,8 +44,6 @@ pub const VERSION: Version = Version {
|
|||
|
||||
#[panic_handler]
|
||||
fn panic(info: &core::panic::PanicInfo) -> ! {
|
||||
arch::register_dump();
|
||||
|
||||
if let Some(loc) = info.location() {
|
||||
let _ = crate::arch::log(format_args!(
|
||||
"Location: {}: {}, {}\r\n",
|
||||
|
|
|
@ -1,18 +1,10 @@
|
|||
// TODO: Add a logger api with logger levels and various outputs
|
||||
pub static TERMINAL_LOGGER: Lazy<Mutex<TermLogger>> = Lazy::new(|| Mutex::new(TermLogger::new()));
|
||||
|
||||
use {
|
||||
limine::{TerminalRequest, TerminalResponse},
|
||||
log::{Level, SetLoggerError},
|
||||
spin::{lazy::Lazy, mutex::Mutex},
|
||||
};
|
||||
use log::{Level, SetLoggerError};
|
||||
|
||||
pub fn init() -> Result<(), SetLoggerError> {
|
||||
log::set_logger(&crate::logger::Logger)?;
|
||||
log::set_max_level(log::LevelFilter::Debug);
|
||||
|
||||
Lazy::force(&TERMINAL_LOGGER);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -42,28 +34,3 @@ impl log::Log for Logger {
|
|||
|
||||
fn flush(&self) {}
|
||||
}
|
||||
|
||||
pub struct TermLogger(&'static TerminalResponse);
|
||||
unsafe impl Send for TermLogger {}
|
||||
impl TermLogger {
|
||||
pub fn new() -> Self {
|
||||
static TERM_REQ: TerminalRequest = TerminalRequest::new(0);
|
||||
Self(
|
||||
TERM_REQ
|
||||
.get_response()
|
||||
.get()
|
||||
.expect("failed to get terminal response"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl core::fmt::Write for TermLogger {
|
||||
fn write_str(&mut self, s: &str) -> core::fmt::Result {
|
||||
if let (Some(w), ts) = (self.0.write(), self.0.terminals()) {
|
||||
for term in ts {
|
||||
w(term, s);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
extern crate kernel;
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
use {
|
||||
alloc::{collections::VecDeque, rc::Rc, slice, vec::Vec},
|
||||
hbvm::validate::validate,
|
||||
};
|
||||
|
||||
use {crate::host::TrapHandler, hbvm::vm::Vm};
|
||||
const TIMER_QUOTIENT: usize = 100;
|
||||
|
||||
pub struct Scheduler<'a> {
|
||||
data: VecDeque<Vm<'a, TrapHandler, TIMER_QUOTIENT>>,
|
||||
}
|
||||
|
||||
// NOTE: This is a very simple schduler and it sucks and should be replaced with a better one
|
||||
// Written By Yours Truly: Munir
|
||||
|
||||
impl Scheduler<'_> {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
data: VecDeque::new(),
|
||||
}
|
||||
}
|
||||
pub fn new_process(&mut self, program: Vec<u8>) {
|
||||
let prog = program.clone();
|
||||
let prog_arc = Rc::new(prog);
|
||||
|
||||
let binding = Rc::try_unwrap(prog_arc).ok().unwrap();
|
||||
|
||||
#[allow(clippy::redundant_else)]
|
||||
if let Err(e) = validate(&program.as_slice()) {
|
||||
log::error!("Program validation error: {e:?}");
|
||||
} else {
|
||||
log::info!("valid program");
|
||||
unsafe {
|
||||
let slice = slice::from_raw_parts(binding.as_ptr(), binding.len());
|
||||
let mut vm = Vm::new_unchecked(&*slice, TrapHandler);
|
||||
vm.memory.insert_test_page();
|
||||
self.data.push_front(vm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(&mut self) -> ! {
|
||||
loop {
|
||||
// If there are no programs to run then sleep.
|
||||
if self.data.is_empty() {
|
||||
use crate::arch::spin_loop;
|
||||
spin_loop();
|
||||
}
|
||||
|
||||
let mut prog = self.data.pop_front().unwrap();
|
||||
let ret = prog.run();
|
||||
match ret {
|
||||
Ok(oki) => match oki {
|
||||
hbvm::vm::VmRunOk::End => {
|
||||
log::info!(
|
||||
"Program ended. {} programs remaining.",
|
||||
// Add one here because we pop a program
|
||||
self.data.len() + 1
|
||||
)
|
||||
}
|
||||
hbvm::vm::VmRunOk::Timer => {
|
||||
log::info!("Timer exhausted. Scheduled program");
|
||||
self.data.push_back(prog);
|
||||
}
|
||||
hbvm::vm::VmRunOk::Ecall => {
|
||||
// panic!();
|
||||
log::info!("{:?}", prog.registers);
|
||||
self.data.push_back(prog);
|
||||
}
|
||||
},
|
||||
|
||||
Err(_) => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,140 +0,0 @@
|
|||
#![allow(unused)]
|
||||
|
||||
use {
|
||||
alloc::{boxed::Box, collections::BTreeMap, sync::Arc, task::Wake},
|
||||
core::{
|
||||
future::Future,
|
||||
pin::Pin,
|
||||
task::{Context, Poll, Waker},
|
||||
},
|
||||
crossbeam_queue::SegQueue,
|
||||
kiam::when,
|
||||
slab::Slab,
|
||||
spin::RwLock,
|
||||
};
|
||||
|
||||
static SPAWN_QUEUE: RwLock<Option<SpawnQueue>> = RwLock::new(None);
|
||||
pub fn spawn(future: impl Future<Output = ()> + Send + 'static) {
|
||||
match &*SPAWN_QUEUE.read() {
|
||||
Some(s) => s.push(Task::new(future)),
|
||||
None => panic!("no task executor is running"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn yield_now() -> impl Future<Output = ()> {
|
||||
struct YieldNow(bool);
|
||||
impl Future for YieldNow {
|
||||
type Output = ();
|
||||
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
if self.0 {
|
||||
Poll::Ready(())
|
||||
} else {
|
||||
self.0 = true;
|
||||
cx.waker().wake_by_ref();
|
||||
Poll::Pending
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
YieldNow(false)
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Executor {
|
||||
tasks: Slab<Task>,
|
||||
queue: TaskQueue,
|
||||
to_spawn: SpawnQueue,
|
||||
wakers: BTreeMap<TaskId, Waker>,
|
||||
}
|
||||
|
||||
impl Executor {
|
||||
pub fn spawn(&mut self, future: impl Future<Output = ()> + Send + 'static) {
|
||||
self.queue
|
||||
.push(TaskId(self.tasks.insert(Task::new(future))));
|
||||
}
|
||||
|
||||
pub fn run(&mut self) {
|
||||
{
|
||||
let mut global_spawner = SPAWN_QUEUE.write();
|
||||
if global_spawner.is_some() {
|
||||
panic!("Task executor is already running");
|
||||
}
|
||||
|
||||
*global_spawner = Some(Arc::clone(&self.to_spawn));
|
||||
}
|
||||
|
||||
loop {
|
||||
when! {
|
||||
let Some(id) = self
|
||||
.to_spawn
|
||||
.pop()
|
||||
.map(|t| TaskId(self.tasks.insert(t)))
|
||||
.or_else(|| self.queue.pop())
|
||||
=> {
|
||||
let Some(task) = self.tasks.get_mut(id.0) else {
|
||||
panic!("Attempted to get task from empty slot: {}", id.0);
|
||||
};
|
||||
|
||||
let mut cx = Context::from_waker(self.wakers.entry(id).or_insert_with(|| {
|
||||
Waker::from(Arc::new(TaskWaker {
|
||||
id,
|
||||
queue: Arc::clone(&self.queue),
|
||||
}))
|
||||
}));
|
||||
|
||||
match task.poll(&mut cx) {
|
||||
Poll::Ready(()) => {
|
||||
self.tasks.remove(id.0);
|
||||
self.wakers.remove(&id);
|
||||
}
|
||||
Poll::Pending => (),
|
||||
}
|
||||
},
|
||||
self.tasks.is_empty() => break,
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
|
||||
*SPAWN_QUEUE.write() = None;
|
||||
}
|
||||
}
|
||||
|
||||
struct Task {
|
||||
future: Pin<Box<dyn Future<Output = ()> + Send>>,
|
||||
}
|
||||
|
||||
impl Task {
|
||||
pub fn new(future: impl Future<Output = ()> + Send + 'static) -> Self {
|
||||
log::trace!("New task scheduled");
|
||||
Self {
|
||||
future: Box::pin(future),
|
||||
}
|
||||
}
|
||||
|
||||
fn poll(&mut self, cx: &mut Context) -> Poll<()> {
|
||||
self.future.as_mut().poll(cx)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
||||
struct TaskId(usize);
|
||||
|
||||
type TaskQueue = Arc<SegQueue<TaskId>>;
|
||||
type SpawnQueue = Arc<SegQueue<Task>>;
|
||||
|
||||
struct TaskWaker {
|
||||
id: TaskId,
|
||||
queue: TaskQueue,
|
||||
}
|
||||
|
||||
impl Wake for TaskWaker {
|
||||
fn wake(self: Arc<Self>) {
|
||||
log::trace!("Woke Task-{:?}", self.id);
|
||||
self.wake_by_ref();
|
||||
}
|
||||
|
||||
fn wake_by_ref(self: &Arc<Self>) {
|
||||
self.queue.push(self.id);
|
||||
}
|
||||
}
|
|
@ -11,7 +11,7 @@
|
|||
"linker": "rust-lld",
|
||||
"panic-strategy": "abort",
|
||||
"disable-redzone": true,
|
||||
"features": "",
|
||||
"features": "-mmx,-sse,+soft-float",
|
||||
"code-model": "kernel",
|
||||
"pre-link-args": {
|
||||
"ld.lld": [
|
||||
|
|
|
@ -4,13 +4,14 @@ version = "0.2.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
str-reader = "0.1.2"
|
||||
cpio_reader = "0.1" # remove me
|
||||
derive_more = "0.99"
|
||||
error-stack = "0.4"
|
||||
fatfs = "0.3"
|
||||
toml = "0.5.2"
|
||||
hbasm.git = "https://git.ablecorp.us/AbleOS/holey-bytes.git"
|
||||
|
||||
env_logger = "0.10"
|
||||
error-stack = "0.2"
|
||||
fatfs = "0.3"
|
||||
log = "0.4" # remove me
|
||||
rpm = "0.11" # remove me
|
||||
zstd = "0.12" # remove me
|
||||
|
||||
[dependencies.reqwest]
|
||||
version = "0.11"
|
||||
|
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,25 @@
|
|||
${ABLEOS_KERNEL}=boot:///kernel
|
||||
# TODO: Make a boot background image for ableOS
|
||||
|
||||
DEFAULT_ENTRY=1
|
||||
TIMEOUT=0
|
||||
VERBOSE=yes
|
||||
INTERFACE_RESOLUTION=1024x768
|
||||
# Terminal related settings
|
||||
TERM_WALLPAPER=boot:///background.bmp
|
||||
TERM_BACKDROP=008080
|
||||
|
||||
:AbleOS
|
||||
COMMENT=Default AbleOS boot entry.
|
||||
PROTOCOL=limine
|
||||
KERNEL_PATH=${ABLEOS_KERNEL}
|
||||
# execute is an array of boot modules to execute
|
||||
KERNEL_CMDLINE="execute=[0,1]"
|
||||
# Setting a default resolution for the framebuffer
|
||||
RESOLUTION=1024x768x24
|
||||
|
||||
MODULE_PATH=boot:///inf_loop.hb
|
||||
MODULE_CMDLINE="diskid=123456789"
|
||||
|
||||
MODULE_PATH=boot:///ecall.hb
|
||||
MODULE_CMDLINE=""
|
|
@ -1,14 +1,8 @@
|
|||
use {
|
||||
derive_more::Display,
|
||||
error_stack::{bail, report, Context, Report, Result, ResultExt},
|
||||
error_stack::{bail, report, Context, IntoReport, Result, ResultExt},
|
||||
fatfs::{FileSystem, FormatVolumeOptions, FsOptions, ReadWriteSeek},
|
||||
std::{
|
||||
fmt::Display,
|
||||
fs::{self, File},
|
||||
io::{self, Write},
|
||||
path::Path,
|
||||
process::{exit, Command},
|
||||
},
|
||||
std::{fmt::Display, fs::File, io, path::Path, process::Command},
|
||||
};
|
||||
|
||||
fn main() -> Result<(), Error> {
|
||||
|
@ -39,7 +33,6 @@ fn main() -> Result<(), Error> {
|
|||
}
|
||||
}
|
||||
|
||||
assemble()?;
|
||||
build(release, target).change_context(Error::Build)
|
||||
}
|
||||
Some("run" | "r") => {
|
||||
|
@ -57,7 +50,6 @@ fn main() -> Result<(), Error> {
|
|||
}
|
||||
}
|
||||
|
||||
assemble()?;
|
||||
build(release, target)?;
|
||||
run(release, target)
|
||||
}
|
||||
|
@ -78,234 +70,73 @@ fn main() -> Result<(), Error> {
|
|||
}
|
||||
}
|
||||
|
||||
fn assemble() -> Result<(), Error> {
|
||||
match std::fs::create_dir("target/test-programs") {
|
||||
Ok(_) => (),
|
||||
Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => (),
|
||||
Err(e) => return Err(Report::new(e).change_context(Error::Io)),
|
||||
}
|
||||
|
||||
for entry in std::fs::read_dir("sysdata/test-programs")
|
||||
.map_err(Report::from)
|
||||
.change_context(Error::Io)?
|
||||
{
|
||||
let entry = entry.map_err(Report::from).change_context(Error::Io)?;
|
||||
if !entry
|
||||
.file_type()
|
||||
.map_err(Report::from)
|
||||
.change_context(Error::Io)?
|
||||
.is_file()
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
let name = entry.file_name();
|
||||
let name = name.to_string_lossy();
|
||||
let name = name.trim_end_matches(".rhai");
|
||||
|
||||
let mut out = File::options()
|
||||
.write(true)
|
||||
.create(true)
|
||||
.open(Path::new("target/test-programs").join(format!("{name}.hbf")))
|
||||
.map_err(Report::from)
|
||||
.change_context(Error::Io)?;
|
||||
|
||||
out.set_len(0)
|
||||
.map_err(Report::from)
|
||||
.change_context(Error::Io)?;
|
||||
|
||||
hbasm::assembler(&mut out, |engine| engine.run_file(entry.path()))
|
||||
.map_err(|e| report!(Error::Assembler).attach_printable(e.to_string()))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_fs() -> Result<FileSystem<impl ReadWriteSeek>, io::Error> {
|
||||
let filename = "sysdata/system_config.toml";
|
||||
let path = Path::new("target/disk.img");
|
||||
|
||||
match std::fs::metadata(path) {
|
||||
Err(e) if e.kind() == io::ErrorKind::NotFound => (),
|
||||
Err(e) => bail!(e),
|
||||
Ok(_) => {
|
||||
return FileSystem::new(
|
||||
File::options().read(true).write(true).open(path)?,
|
||||
FsOptions::new(),
|
||||
)
|
||||
.into_report()
|
||||
}
|
||||
}
|
||||
|
||||
let mut img = File::options()
|
||||
.read(true)
|
||||
.write(true)
|
||||
.create(true)
|
||||
.open(Path::new("target/disk.img"))?;
|
||||
.open(path)?;
|
||||
|
||||
img.set_len(1024 * 1024 * 64)?;
|
||||
|
||||
fatfs::format_volume(&mut img, FormatVolumeOptions::new())?;
|
||||
|
||||
let fs = FileSystem::new(img, FsOptions::new())?;
|
||||
|
||||
// Read the contents of the file using a `match` block
|
||||
// to return the `data: Ok(c)` as a `String`
|
||||
// or handle any `errors: Err(_)`.
|
||||
let contents = match fs::read_to_string(filename) {
|
||||
// If successful return the files text as `contents`.
|
||||
// `c` is a local variable.
|
||||
Ok(c) => c,
|
||||
// Handle the `error` case.
|
||||
Err(_) => {
|
||||
// Write `msg` to `stderr`.
|
||||
eprintln!("Could not read file `{}`", filename);
|
||||
// Exit the program with exit code `1`.
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
use toml::Value;
|
||||
|
||||
let mut limine_str = String::new();
|
||||
|
||||
let mut data: Value = toml::from_str(&contents).unwrap();
|
||||
let boot_table = data.get_mut("boot");
|
||||
let limine_table = boot_table.unwrap().get_mut("limine").unwrap();
|
||||
let default_entry = limine_table.get("default_entry").unwrap();
|
||||
let timeout = limine_table.get("timeout").unwrap();
|
||||
let interface_resolution = limine_table.get("interface_resolution").unwrap();
|
||||
let verbose = limine_table.get("verbose").unwrap();
|
||||
let term_wallpaper = limine_table.get("term_wallpaper").unwrap();
|
||||
|
||||
let vb_post = match verbose.as_bool().unwrap() {
|
||||
true => "yes",
|
||||
false => "no",
|
||||
};
|
||||
let term_background = limine_table
|
||||
.get("term_backdrop")
|
||||
.unwrap_or(&Value::Integer(0));
|
||||
let base = format!(
|
||||
"DEFAULT_ENTRY={}
|
||||
TIMEOUT={}
|
||||
VERBOSE={}
|
||||
INTERFACE_RESOLUTION={}
|
||||
# Terminal related settings
|
||||
TERM_WALLPAPER={}
|
||||
TERM_BACKDROP={}
|
||||
",
|
||||
default_entry,
|
||||
timeout,
|
||||
vb_post,
|
||||
interface_resolution,
|
||||
term_wallpaper.as_str().unwrap(),
|
||||
term_background
|
||||
);
|
||||
|
||||
// Copy the term_wallpaper to the image
|
||||
let term_wallpaper_path = term_wallpaper
|
||||
.as_str()
|
||||
.unwrap()
|
||||
.split("boot:///")
|
||||
.last()
|
||||
.unwrap();
|
||||
copy_file_to_img(&format!("sysdata/{}", term_wallpaper_path), &fs);
|
||||
|
||||
limine_str.push_str(&base);
|
||||
|
||||
let boot_entries = limine_table.as_table_mut().unwrap();
|
||||
let mut real_boot_entries = boot_entries.clone();
|
||||
for (key, value) in boot_entries.into_iter() {
|
||||
if !value.is_table() {
|
||||
real_boot_entries.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
for (name, mut value) in real_boot_entries {
|
||||
let comment = value.get("comment").unwrap();
|
||||
let protocol = value.get("protocol").unwrap();
|
||||
let resolution = value.get("resolution").unwrap();
|
||||
let kernel_path = value.get("kernel_path").unwrap();
|
||||
let kernel_cmdline = value.get("kernel_cmdline").unwrap();
|
||||
|
||||
let text_entry = format!(
|
||||
"
|
||||
:{}
|
||||
COMMENT={}
|
||||
PROTOCOL={}
|
||||
RESOLUTION={}
|
||||
KERNEL_PATH={}
|
||||
KERNEL_CMDLINE={}
|
||||
|
||||
",
|
||||
name,
|
||||
comment.as_str().unwrap(),
|
||||
protocol.as_str().unwrap(),
|
||||
resolution.as_str().unwrap(),
|
||||
kernel_path.as_str().unwrap(),
|
||||
kernel_cmdline,
|
||||
);
|
||||
|
||||
limine_str.push_str(&text_entry);
|
||||
|
||||
let modules = value.get_mut("modules").unwrap().as_table_mut().unwrap();
|
||||
// let mut real_modules = modules.clone();
|
||||
|
||||
for (key, value) in modules.into_iter() {
|
||||
if value.is_table() {
|
||||
let path = value.get("path").expect("You must have `path` as a value");
|
||||
let default_value = Value::String("".into());
|
||||
let cmd_line = value.get("cmd_line").unwrap_or(&default_value);
|
||||
|
||||
let a = format!(
|
||||
" MODULE_PATH={}
|
||||
MODULE_CMDLINE={}\n\n",
|
||||
path.as_str().unwrap(),
|
||||
cmd_line
|
||||
);
|
||||
limine_str.push_str(&a);
|
||||
}
|
||||
}
|
||||
|
||||
// Copy modules into the test_programs directory
|
||||
modules.into_iter().for_each(|(key, value)| {
|
||||
if value.is_table() {
|
||||
let path = value
|
||||
.get("path")
|
||||
.expect("You must have a `path` as a value")
|
||||
.as_str()
|
||||
.unwrap()
|
||||
.split("boot:///")
|
||||
.last()
|
||||
.unwrap();
|
||||
let fpath = format!("target/test-programs/{}", path);
|
||||
copy_file_to_img(&fpath, &fs);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let bootdir = fs.root_dir().create_dir("efi")?.create_dir("boot")?;
|
||||
|
||||
let mut f = fs.root_dir().create_file("limine.cfg")?;
|
||||
let a = f.write(limine_str.as_bytes())?;
|
||||
drop(f);
|
||||
|
||||
io::copy(
|
||||
&mut File::open("limine/BOOTX64.EFI")
|
||||
.map_err(Report::from)
|
||||
.attach_printable("Copying Limine (x86_64): have you pulled the submodule?")?,
|
||||
.into_report()
|
||||
.attach_printable("copying Limine bootloader (have you pulled the submodule?)")?,
|
||||
&mut bootdir.create_file("bootx64.efi")?,
|
||||
)?;
|
||||
|
||||
io::copy(
|
||||
&mut File::open("limine/BOOTAA64.EFI")
|
||||
.map_err(Report::from)
|
||||
.attach_printable("Copying Limine (ARM): have you pulled the submodule?")?,
|
||||
.into_report()
|
||||
.attach_printable(
|
||||
"copying Limine bootloader arm version (have you pulled the submodule?)",
|
||||
)?,
|
||||
&mut bootdir.create_file("bootaa64.efi")?,
|
||||
)?;
|
||||
|
||||
io::copy(
|
||||
&mut File::open("repbuild/limine.cfg")?,
|
||||
&mut fs.root_dir().create_file("limine.cfg")?,
|
||||
)?;
|
||||
|
||||
io::copy(
|
||||
&mut File::open("repbuild/background.bmp")?,
|
||||
&mut fs.root_dir().create_file("background.bmp")?,
|
||||
)?;
|
||||
io::copy(
|
||||
&mut File::open("repbuild/holeybytes/inf_loop.hb")?,
|
||||
&mut fs.root_dir().create_file("inf_loop.hb")?,
|
||||
)?;
|
||||
|
||||
io::copy(
|
||||
&mut File::open("repbuild/holeybytes/ecall.hb")?,
|
||||
&mut fs.root_dir().create_file("ecall.hb")?,
|
||||
)?;
|
||||
|
||||
drop(bootdir);
|
||||
Ok(fs)
|
||||
}
|
||||
|
||||
fn copy_file_to_img(fpath: &str, fs: &FileSystem<File>) {
|
||||
let path = Path::new(fpath);
|
||||
io::copy(
|
||||
&mut File::open(path).expect(&format!("Could not open file {fpath}")),
|
||||
&mut fs
|
||||
.root_dir()
|
||||
.create_file(&path.file_name().unwrap().to_string_lossy())
|
||||
.expect("Unable to create file"),
|
||||
)
|
||||
.expect("Copy failed");
|
||||
}
|
||||
|
||||
fn build(release: bool, target: Target) -> Result<(), Error> {
|
||||
let fs = get_fs().change_context(Error::Io)?;
|
||||
let mut com = Command::new("cargo");
|
||||
|
@ -328,17 +159,10 @@ fn build(release: bool, target: Target) -> Result<(), Error> {
|
|||
_ => (),
|
||||
}
|
||||
|
||||
let mut path: String = "kernel".to_string();
|
||||
let kernel_dir = match target {
|
||||
Target::X86_64 => {
|
||||
path.push_str("_x86-64");
|
||||
"target/x86_64-ableos"
|
||||
}
|
||||
Target::X86_64 => "target/x86_64-ableos",
|
||||
Target::Riscv64Virt => "target/riscv64-virt-ableos",
|
||||
Target::Aarch64 => {
|
||||
path.push_str("_aarch64");
|
||||
"target/aarch64-virt-ableos"
|
||||
}
|
||||
Target::Aarch64 => "target/aarch64-virt-ableos",
|
||||
};
|
||||
|
||||
(|| -> std::io::Result<_> {
|
||||
|
@ -348,11 +172,11 @@ fn build(release: bool, target: Target) -> Result<(), Error> {
|
|||
.join(if release { "release" } else { "debug" })
|
||||
.join("kernel"),
|
||||
)?,
|
||||
&mut fs.root_dir().create_file(&path)?,
|
||||
&mut fs.root_dir().create_file("kernel")?,
|
||||
)
|
||||
.map(|_| ())
|
||||
})()
|
||||
.map_err(Report::from)
|
||||
.into_report()
|
||||
.change_context(Error::Io)
|
||||
}
|
||||
|
||||
|
@ -372,8 +196,6 @@ fn run(release: bool, target: Target) -> Result<(), Error> {
|
|||
"-drive", "file=target/disk.img,format=raw",
|
||||
"-m", "4G",
|
||||
"-smp", "cores=4",
|
||||
// "-enable-kvm",
|
||||
"-cpu", "Broadwell-v4"
|
||||
]);
|
||||
}
|
||||
Target::Riscv64Virt => {
|
||||
|
@ -407,7 +229,7 @@ fn run(release: bool, target: Target) -> Result<(), Error> {
|
|||
|
||||
match com
|
||||
.status()
|
||||
.map_err(Report::from)
|
||||
.into_report()
|
||||
.change_context(Error::ProcessSpawn)?
|
||||
{
|
||||
s if s.success() => Ok(()),
|
||||
|
@ -434,18 +256,18 @@ fn fetch_ovmf(target: Target) -> Result<String, OvmfFetchError> {
|
|||
.write(true)
|
||||
.read(true)
|
||||
.open(ovmf_path)
|
||||
.map_err(Report::from)
|
||||
.into_report()
|
||||
.change_context(OvmfFetchError::Io)?,
|
||||
Ok(_) => return Ok(ovmf_path.to_owned()),
|
||||
Err(e) => return Err(report!(e).change_context(OvmfFetchError::Io)),
|
||||
};
|
||||
let mut bytes = reqwest::blocking::get(ovmf_url)
|
||||
.map_err(Report::from)
|
||||
.into_report()
|
||||
.change_context(OvmfFetchError::Fetch)?;
|
||||
|
||||
bytes
|
||||
.copy_to(&mut file)
|
||||
.map_err(Report::from)
|
||||
.into_report()
|
||||
.change_context(OvmfFetchError::Io)?;
|
||||
|
||||
Ok(ovmf_path.to_owned())
|
||||
|
@ -482,8 +304,6 @@ enum Error {
|
|||
ProcessSpawn,
|
||||
#[display(fmt = "Failed to fetch UEFI firmware")]
|
||||
OvmfFetch,
|
||||
#[display(fmt = "Failed to assemble Holey Bytes code")]
|
||||
Assembler,
|
||||
#[display(fmt = "QEMU Error: {}", "fmt_qemu_err(*_0)")]
|
||||
Qemu(Option<i32>),
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
[toolchain]
|
||||
channel = "nightly-2023-09-17"
|
||||
channel = "nightly"
|
||||
components = ["rust-src", "llvm-tools"]
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
hex_literal_case = "Upper"
|
||||
imports_granularity = "One"
|
||||
hex_literal_case = "Upper"
|
||||
imports_granularity = "One"
|
||||
struct_field_align_threshold = 5
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
pkgs.mkShell rec {
|
||||
buildInputs = with pkgs; [
|
||||
clang
|
||||
llvmPackages.bintools
|
||||
rustup
|
||||
clang
|
||||
llvmPackages.bintools
|
||||
rustup
|
||||
qemu_full
|
||||
# OMVFFull
|
||||
# OMVF
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
Boolean
|
||||
Stuffed into a u8 to be indexed into
|
||||
|
||||
00_00_00_01
|
||||
^^--- One Boolean
|
||||
|the Second Boolean
|
||||
|
||||
UTF8 String
|
||||
"Able The Above" => UTF8 14 bytes long
|
||||
Date Time (U128 seconds since the beginning of the universe)
|
||||
|
||||
Binary Blob
|
||||
|
||||
List<T>
|
||||
Bound/Unbound
|
||||
// Ordered/Unordered
|
||||
|
||||
|
||||
Examples:
|
||||
OSPath Is Unbounded List <String>
|
||||
|
||||
Hashmap<K, V>
|
|
@ -1,40 +0,0 @@
|
|||
${ABLEOS_KERNEL}=boot:///kernel
|
||||
# TODO: Make a boot background image for ableOS
|
||||
|
||||
DEFAULT_ENTRY=1
|
||||
TIMEOUT=0
|
||||
VERBOSE=yes
|
||||
INTERFACE_RESOLUTION=1024x768
|
||||
# Terminal related settings
|
||||
TERM_WALLPAPER=boot:///background.bmp
|
||||
TERM_BACKDROP=008080
|
||||
|
||||
:AbleOS
|
||||
COMMENT=Default AbleOS boot entry.
|
||||
PROTOCOL=limine
|
||||
KERNEL_PATH=boot:///kernel_${ARCH}
|
||||
# execute is an array of boot modules to execute
|
||||
KERNEL_CMDLINE=""
|
||||
# Setting a default resolution for the framebuffer
|
||||
RESOLUTION=1024x768x24
|
||||
|
||||
MODULE_PATH=boot:///failure.hbf
|
||||
MODULE_CMDLINE=""
|
||||
|
||||
MODULE_PATH=boot:///ecall.hbf
|
||||
MODULE_CMDLINE=""
|
||||
|
||||
MODULE_PATH=boot:///main.hbf
|
||||
MODULE_CMDLINE=""
|
||||
|
||||
MODULE_PATH=boot:///keyboard_driver.hbf
|
||||
MODULE_CMDLINE="arch=${ARCH}"
|
||||
|
||||
MODULE_PATH=boot:///vfs_test.hbf
|
||||
MODULE_CMDLINE=""
|
||||
|
||||
MODULE_PATH=boot:///limine_framebuffer_driver.hbf
|
||||
MODULE_CMDLINE="height=10 width=10 arch=${ARCH}"
|
||||
|
||||
MODULE_PATH=boot:///serial_driver.hbf
|
||||
MODULE_CMDLINE="arch=${ARCH}"
|
|
@ -1,14 +0,0 @@
|
|||
# Dev
|
||||
Dev is a (currently) hypothetical tool meant to be used to ease development and compilation on ableOS.
|
||||
|
||||
## Usage
|
||||
A `meta.toml` file must be in the project root. A `src` folder and a `lib` folder must exist.
|
||||
Binaries should be put into a folder named `bin`.
|
||||
|
||||
```
|
||||
bin/
|
||||
lib/
|
||||
src/
|
||||
```
|
||||
|
||||
The folders `lib/` and `bin/` should both be left out of source tracking.
|
|
@ -1,16 +0,0 @@
|
|||
[package]
|
||||
name = "dev"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
file_service = "0.0.1"
|
||||
|
||||
[dependants.binaries]
|
||||
susc.version = "1.0.0"
|
||||
|
||||
[build.debug]
|
||||
command = "susc src/main.hbl"
|
||||
|
||||
[run.debug]
|
||||
depends = ["build.debug"]
|
||||
command = "bin/main.hbf"
|
|
@ -1,5 +0,0 @@
|
|||
#include "lib/file_service.h"
|
||||
|
||||
int main() {
|
||||
File fhand = file_open("meta.toml");
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
[package]
|
||||
name = "fisp_test"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
[dependants.binaries]
|
||||
# Refers to @FunkyEgg's lisp compiler for ableOS
|
||||
fisp = ""
|
||||
|
||||
[build.debug]
|
||||
command = "fisp src/main.fisp"
|
||||
|
||||
[run.debug]
|
||||
depends = ["build.debug"]
|
||||
command = "bin/main.hbf"
|
|
@ -1 +0,0 @@
|
|||
(log info "Hello World\n")
|
|
@ -1,16 +0,0 @@
|
|||
[package]
|
||||
name = "htasm_test"
|
||||
authors = ["able"]
|
||||
|
||||
# Similar to cargo libraries
|
||||
[dependants.libraries]
|
||||
# Similar to cargo install
|
||||
[dependants.binaries]
|
||||
htasm = ""
|
||||
|
||||
[build.debug]
|
||||
command = "htasm src/main.S"
|
||||
|
||||
[run.debug]
|
||||
depends = ["build.debug"]
|
||||
command = "bin/main.hbf"
|
|
@ -1,10 +0,0 @@
|
|||
jmp start
|
||||
|
||||
start:
|
||||
li64 r1, 3
|
||||
li64 r2, 1
|
||||
lra16 r3, r0, hello_string
|
||||
li64 r4, 0x14
|
||||
|
||||
string
|
||||
.db "Hello, world!\n"
|
|
@ -1,5 +0,0 @@
|
|||
type BufferID = u64;
|
||||
|
||||
protocol SDS {
|
||||
fn register_protocol(BufferID, String) -> bool;
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
# Logging Service
|
||||
The logging service uses the first byte in the message to identify the request type.
|
||||
|
||||
## Current Log Impl
|
||||
<!-- This is a hack but should be noted -->
|
||||
[STR] -> string
|
||||
[U8] -> Log Level. Refer to the log level table.
|
||||
|
||||
## Log
|
||||
[U8] -> Log a message.
|
||||
[U8] -> Log Level.
|
||||
[U64] -> Path length
|
||||
[STR] -> Path String
|
||||
[U64] -> Line number
|
||||
[U64] -> column number
|
||||
[U64] -> Log String length
|
||||
[STR] -> Log String
|
||||
|
||||
|
||||
## Log Level Table
|
||||
0 -> Error
|
||||
1 -> Warn
|
||||
2 -> Info
|
||||
3 -> Debug
|
||||
4 -> Trace
|
|
@ -1,57 +0,0 @@
|
|||
# Memory service spec
|
||||
The memory service uses the first byte in the message to identify the request type.
|
||||
|
||||
## Allocate (12 bytes)
|
||||
[U8] -> 0
|
||||
[U8] -> Page count
|
||||
<!-- Currently this does not allocate here, check r1 for a ptr to alloc to -->
|
||||
[U64] -> ptr to alloc at
|
||||
|
||||
## Deallocate (12 bytes)
|
||||
<!-- Currently this does not deallocate -->
|
||||
[U8] -> 1
|
||||
[U8] -> Page count
|
||||
[U64] -> ptr to dealloc from
|
||||
|
||||
## Map Device Into Memory
|
||||
Typically only used for simple drivers such as vga.
|
||||
<!-- Unimp -->
|
||||
[U8] -> 2
|
||||
[U8] -> Page count
|
||||
[U64] -> HostID
|
||||
[U64] -> DeviceID
|
||||
|
||||
## Unmap Device From Memory
|
||||
<!-- Unimp -->
|
||||
[U8] -> 3
|
||||
[U8] -> Page count
|
||||
[U64] -> HostID
|
||||
[U64] -> DeviceID
|
||||
|
||||
## Set Memory Quota
|
||||
<!-- unimp -->
|
||||
[U8] -> 4
|
||||
[U64] -> HostID
|
||||
[U64] -> ProcessID
|
||||
[U8] -> Refer to the Memory Quota Table
|
||||
[U64] -> Memory quota. In pages of memory. Multiply by 4096 to get the total byte count.
|
||||
|
||||
### Memory Quota Table
|
||||
0 -> No quota.
|
||||
1 -> Soft quota. Notifies the process supervisor.
|
||||
2 -> Hard quota. Refuses to allocate above the quota.
|
||||
3 -> Kill quota. Kill the process and notify the supervisor when the process tries to allocate above the quota.
|
||||
|
||||
## Set Buffer Quota
|
||||
<!-- unimp -->
|
||||
[U8] -> 4
|
||||
[U64] -> HostID
|
||||
[U64] -> BufferID
|
||||
[U8] -> Refer to the Buffer Quota Table
|
||||
[U64] -> Buffer quota. In pages of memory. Multiply by 4096 to get the total byte count.
|
||||
|
||||
### Buffer Quota Table
|
||||
<!-- Because of the abusability of buffers there is no Kill Quota -->
|
||||
0 -> No quota
|
||||
1 -> Soft quota. Notify supervisor of quota violation Buffer Message
|
||||
2 -> Hard quota. Return an error message to the process that sent the message.
|
|
@ -1,45 +0,0 @@
|
|||
[boot]
|
||||
[boot.limine]
|
||||
default_entry = 1
|
||||
timeout = 0
|
||||
verbose = true
|
||||
interface_resolution = "1024x768x24"
|
||||
# Terminal related settings
|
||||
term_wallpaper = "boot:///background.bmp"
|
||||
term_background = "008080"
|
||||
|
||||
[boot.limine.ableos]
|
||||
comment = "Default AbleOS boot entry."
|
||||
protocol = "limine"
|
||||
kernel_path = "boot:///kernel_${ARCH}"
|
||||
kernel_cmdline = ""
|
||||
resolution = "1024x768x24"
|
||||
|
||||
|
||||
[boot.limine.ableos.modules]
|
||||
[boot.limine.ableos.modules.failure]
|
||||
path = "boot:///failure.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.ecall]
|
||||
path = "boot:///ecall.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.sds_test]
|
||||
path = "boot:///sds_test.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.main]
|
||||
path = "boot:///main.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.keyboard_driver]
|
||||
path = "boot:///keyboard_driver.hbf"
|
||||
cmd_line = "arch=${ARCH}"
|
||||
|
||||
[boot.limine.ableos.modules.vfs_test]
|
||||
path = "boot:///vfs_test.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.limine_framebuffer_driver]
|
||||
path = "boot:///limine_framebuffer_driver.hbf"
|
||||
cmd_line = "height=10 width=10 arch=${ARCH}"
|
||||
|
||||
[boot.limine.ableos.modules.serial_driver]
|
||||
path = "boot:///serial_driver.hbf"
|
||||
cmd_line = "arch=${ARCH}"
|
|
@ -1,3 +0,0 @@
|
|||
li64 (r1, 2);
|
||||
eca ();
|
||||
tx ();
|
|
@ -1 +0,0 @@
|
|||
un();
|
|
@ -1 +0,0 @@
|
|||
A kind of standard library.
|
|
@ -1,54 +0,0 @@
|
|||
fn ipc_send(buffer_id, mem_addr, length){
|
||||
// set the ecall
|
||||
li64(r1, 3);
|
||||
// Set the buffer ID to be the BufferID
|
||||
li64(r2, buffer_id);
|
||||
lra(r3, r0, mem_addr);
|
||||
// set the length
|
||||
li64(r4, length);
|
||||
// ecall
|
||||
eca();
|
||||
}
|
||||
|
||||
|
||||
fn ipc_recv(buffer_id){
|
||||
li64(r1, 4);
|
||||
eca();
|
||||
}
|
||||
|
||||
|
||||
fn ipc_make_bound_buffer(length) {
|
||||
li64(r1, 1);
|
||||
li64(r2, 1);
|
||||
li64(r3, length);
|
||||
eca();
|
||||
|
||||
// The ipc buffer id is in r1
|
||||
}
|
||||
|
||||
private fn log(log_level, string){
|
||||
// This is NOT the final format
|
||||
let str = data::str(string + log_level);
|
||||
// 1 byte for the log level
|
||||
// 8 bytes for the length to the message
|
||||
// 8 bytes for the pointer to the string
|
||||
|
||||
ipc_send(1, str, str.len);
|
||||
}
|
||||
|
||||
fn Error(string) {log(0, string);}
|
||||
fn Warn(string) {log(1, string);}
|
||||
fn Info(string) {log(2, string);}
|
||||
// Due to rhai limitations this cannot be debug
|
||||
// because of this all of the log levels are upper case
|
||||
fn Debug(string) {log(3, string);}
|
||||
fn Trace(string) {log(4, string);}
|
||||
|
||||
|
||||
fn open(string_path){
|
||||
let file_path = data::str(string_path);
|
||||
ipc_send(2, file_path, file_path.len);
|
||||
}
|
||||
fn write(){}
|
||||
fn read(){}
|
||||
fn close(){}
|
|
@ -1,199 +0,0 @@
|
|||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
fn print_register(reg){
|
||||
std::Debug("-----------------");
|
||||
let c0 = declabel();
|
||||
let c1 = declabel();
|
||||
let c2 = declabel();
|
||||
let c3 = declabel();
|
||||
let c4 = declabel();
|
||||
let c5 = declabel();
|
||||
let c6 = declabel();
|
||||
let c7 = declabel();
|
||||
let c8 = declabel();
|
||||
let c9 = declabel();
|
||||
let ca = declabel();
|
||||
let cb = declabel();
|
||||
let cc = declabel();
|
||||
let cd = declabel();
|
||||
let ce = declabel();
|
||||
let cf = declabel();
|
||||
let end = declabel();
|
||||
|
||||
cp(r32, reg);
|
||||
li64(r35, 16);
|
||||
|
||||
let next_loop = label();
|
||||
|
||||
addi64(r35, r35, -1);
|
||||
li64(r37, 4);
|
||||
mul64(r36, r35, r37);
|
||||
sru64(r34, r32, r36);
|
||||
|
||||
andi(r34, r34, 0xf);
|
||||
li64(r33, 0);
|
||||
|
||||
jeq(r34, r33, c0);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c1);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c2);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c3);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c4);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c5);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c6);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c7);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c8);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, c9);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, ca);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, cb);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, cc);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, cd);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, ce);
|
||||
addi64(r33, r33, 1);
|
||||
jeq(r34, r33, cf);
|
||||
|
||||
std::Error("This should be an invalid state");
|
||||
|
||||
let next = label();
|
||||
jne(r0, r35, next_loop);
|
||||
jeq(r0, r0, end);
|
||||
|
||||
here(c0);
|
||||
std::Debug("0");
|
||||
jeq(r0, r0, next);
|
||||
here(c1);
|
||||
std::Debug("1");
|
||||
jeq(r0, r0, next);
|
||||
here(c2);
|
||||
std::Debug("2");
|
||||
jeq(r0, r0, next);
|
||||
here(c3);
|
||||
std::Debug("3");
|
||||
jeq(r0, r0, next);
|
||||
here(c4);
|
||||
std::Debug("4");
|
||||
jeq(r0, r0, next);
|
||||
here(c5);
|
||||
std::Debug("5");
|
||||
jeq(r0, r0, next);
|
||||
here(c6);
|
||||
std::Debug("6");
|
||||
jeq(r0, r0, next);
|
||||
here(c7);
|
||||
std::Debug("7");
|
||||
jeq(r0, r0, next);
|
||||
here(c8);
|
||||
std::Debug("8");
|
||||
jeq(r0, r0, next);
|
||||
here(c9);
|
||||
std::Debug("9");
|
||||
jeq(r0, r0, next);
|
||||
here(ca);
|
||||
std::Debug("A");
|
||||
jeq(r0, r0, next);
|
||||
here(cb);
|
||||
std::Debug("B");
|
||||
jeq(r0, r0, next);
|
||||
here(cc);
|
||||
std::Debug("C");
|
||||
jeq(r0, r0, next);
|
||||
here(cd);
|
||||
std::Debug("D");
|
||||
jeq(r0, r0, next);
|
||||
here(ce);
|
||||
std::Debug("E");
|
||||
jeq(r0, r0, next);
|
||||
here(cf);
|
||||
std::Debug("F");
|
||||
jeq(r0, r0, next);
|
||||
|
||||
here(end);
|
||||
std::Debug("-----------------");
|
||||
}
|
||||
|
||||
fn get_keyboard_status(){
|
||||
li64(r1, 5);
|
||||
li64(r2, 0x64);
|
||||
eca();
|
||||
}
|
||||
|
||||
fn get_keyboard_input(){
|
||||
li64(r1, 5);
|
||||
li64(r2, 0x60);
|
||||
eca();
|
||||
}
|
||||
|
||||
fn is_keyup(rb, ra){
|
||||
li64(rb, 15);
|
||||
sru64(rb, ra, rb);
|
||||
andi(rb, rb, 1);
|
||||
}
|
||||
|
||||
fn dump_registers(){
|
||||
li64(r1, 0xff);
|
||||
eca();
|
||||
}
|
||||
|
||||
fn to_ascii(rb, ra){
|
||||
let str = data::str(
|
||||
" 1234567890-= " +
|
||||
"qwertyuiop[] " +
|
||||
"asdfghjkl;'` \\" +
|
||||
"zxcvbnm,./ " +
|
||||
"* " +
|
||||
"789-456+1230. "
|
||||
);
|
||||
andi(r33, ra, 0x00ff);
|
||||
lra(rb, r0, str);
|
||||
add64(rb, rb, r33);
|
||||
ld(rb, rb, 0, 1);
|
||||
}
|
||||
|
||||
fn display_key(ra){
|
||||
andi(r33, ra, 0x00ff);
|
||||
ori(r33, r33, 0x0200);
|
||||
let location = 0x20000;
|
||||
li64(r32, location);
|
||||
st(r33, r32, 0, 2);
|
||||
|
||||
li64(r1, 3);
|
||||
li64(r2, 1);
|
||||
li64(r3, location);
|
||||
li64(r4, 2);
|
||||
eca();
|
||||
}
|
||||
|
||||
fn main(){
|
||||
let key_up = declabel();
|
||||
let main_loop = label();
|
||||
get_keyboard_status();
|
||||
andi(r12, r3, 1);
|
||||
li64(r13, 0x1);
|
||||
jne(r13, r12, main_loop);
|
||||
get_keyboard_input();
|
||||
cp(r12, r3);
|
||||
is_keyup(r14, r12);
|
||||
jne(r0, r14, key_up);
|
||||
to_ascii(r15, r12);
|
||||
display_key(r15);
|
||||
jeq(r0, r0, main_loop);
|
||||
here(key_up);
|
||||
jeq(r0, r0, main_loop);
|
||||
|
||||
tx();
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,164 +0,0 @@
|
|||
// Change and add to this as you see fit.
|
||||
// The STD and even syscalls are still in flux.
|
||||
// Do your best to avoid adding bad design.
|
||||
// Use std abstractions if they exist like logging functionality
|
||||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
|
||||
fn rect(reg_x, reg_y, w, h, color) {
|
||||
li64(r3, 0);
|
||||
li64(r4, 0);
|
||||
li64(r5, w);
|
||||
li64(r6, h);
|
||||
|
||||
let start_y = label();
|
||||
|
||||
let start_x = label();
|
||||
|
||||
add64(r9, r3, reg_x);
|
||||
add64(r10, r4, reg_y);
|
||||
pixel(r9, r10, color);
|
||||
|
||||
li64(r1, 1);
|
||||
add64(r3, r3, r1);
|
||||
|
||||
jltu(r3, r5, start_x);
|
||||
|
||||
li64(r1, 1);
|
||||
add64(r4, r4, r1);
|
||||
|
||||
li64(r3, 0);
|
||||
|
||||
jltu(r4, r6, start_y);
|
||||
}
|
||||
|
||||
fn pixel(reg_x, reg_y, color) {
|
||||
let BUFFER = 0xFFFF8000C0000000;
|
||||
let WIDTH = 1024;
|
||||
|
||||
// r1 = y * WIDTH
|
||||
li64(r1, WIDTH);
|
||||
mul64(r1, reg_y, r1);
|
||||
|
||||
// r2 = x + r2
|
||||
add64(r2, reg_x, r1);
|
||||
|
||||
// r2 = r2 * 4
|
||||
li64(r1, 4);
|
||||
mul64(r2, r2, r1);
|
||||
|
||||
// store pixel value
|
||||
li64(r1, color);
|
||||
st(r1, r2, BUFFER, 4);
|
||||
}
|
||||
|
||||
fn clear() {
|
||||
// rect(r0, r0, 1024, 768, 0xff222222);
|
||||
|
||||
let BUFFER = 0xFFFF8000C0000000;
|
||||
// let BUFFER = 0xFFFF8000BC430000;
|
||||
// on arm the FB is at 0xFFFF8000BC430000
|
||||
// FIXME: get the framebuffer pointer from the starting arguments
|
||||
|
||||
li64(r1, 0xff222222);
|
||||
li64(r2, 0);
|
||||
li64(r3, 1);
|
||||
li64(r4, 1024 * 768);
|
||||
li64(r5, 4);
|
||||
let start = label();
|
||||
mul64(r6, r2, r5);
|
||||
st(r1, r6, BUFFER, 4);
|
||||
add64(r2, r2, r3);
|
||||
jltu(r2, r4, start);
|
||||
}
|
||||
|
||||
// Define main
|
||||
fn main() {
|
||||
// Log the arguments
|
||||
{
|
||||
cp(r3, r1);
|
||||
cp(r4, r2);
|
||||
|
||||
// log level
|
||||
li8(r6, 2);
|
||||
|
||||
add64(r5, r3, r4);
|
||||
li64(r7, 1);
|
||||
st(r6, r5, 0, 1);
|
||||
add64(r4, r4, r7);
|
||||
|
||||
li64(r1, 3);
|
||||
li64(r2, 1);
|
||||
|
||||
eca();
|
||||
// Zero out all used registers
|
||||
li64(r1, 0);
|
||||
li64(r2, 0);
|
||||
li64(r3, 0);
|
||||
li64(r4, 0);
|
||||
li64(r5, 0);
|
||||
li64(r6, 0);
|
||||
li64(r7, 0);
|
||||
}
|
||||
std::Info("Starting the limine framebuffer driver.");
|
||||
// un();
|
||||
li64(r100, 300);
|
||||
li64(r101, 300);
|
||||
li64(r102, 1);
|
||||
li64(r103, 1);
|
||||
li64(r104, 1024 - 20);
|
||||
li64(r105, 768 - 20);
|
||||
li64(r106, 0);
|
||||
li64(r107, 0);
|
||||
|
||||
clear();
|
||||
|
||||
let start = label();
|
||||
|
||||
rect(r100, r101, 20, 20, 0xff222222);
|
||||
//clear();
|
||||
|
||||
add64(r100, r100, r102);
|
||||
add64(r101, r101, r103);
|
||||
|
||||
let after_x_right = declabel();
|
||||
jltu(r100, r104, after_x_right);
|
||||
li64(r102, -1);
|
||||
here(after_x_right);
|
||||
|
||||
let after_x_left = declabel();
|
||||
jgtu(r100, r106, after_x_left);
|
||||
li64(r102, 1);
|
||||
li64(r100, 0);
|
||||
here(after_x_left);
|
||||
|
||||
let after_y_right = declabel();
|
||||
jltu(r101, r105, after_y_right);
|
||||
li64(r103, -1);
|
||||
here(after_y_right);
|
||||
|
||||
let after_y_left = declabel();
|
||||
jgtu(r101, r107, after_y_left);
|
||||
li64(r103, 1);
|
||||
li64(r101, 0);
|
||||
here(after_y_left);
|
||||
|
||||
rect(r100, r101, 20, 20, 0xffffffff);
|
||||
|
||||
li64(r200, 0);
|
||||
li64(r201, 1);
|
||||
li64(r202, 10000);
|
||||
let wait = label();
|
||||
add64(r200, r200, r201);
|
||||
jltu(r200, r202, wait);
|
||||
|
||||
jeq(r0, r0, start);
|
||||
//jmp(start);
|
||||
|
||||
std::Info("done");
|
||||
|
||||
// Terminate execution.
|
||||
tx();
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,33 +0,0 @@
|
|||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
fn main(){
|
||||
std::Error(":o) h0nk");
|
||||
std::Warn("Your mom is a worm!");
|
||||
std::Info("Hello, world!");
|
||||
// std::Debug("XYZ");
|
||||
// std::Trace("Trace Deez");
|
||||
|
||||
// let ADDR = 0xFFFF_FFFF_8100_0000;
|
||||
// let ADDR_PLUS_ONE = ADDR + 1;
|
||||
// let ADDR_PLUS_NINE = ADDR + 9;
|
||||
|
||||
// li64(r25, 1);
|
||||
// st(r25, r0, ADDR, 1);
|
||||
|
||||
// li64(r25, 0);
|
||||
// st(r25, r0, ADDR_PLUS_ONE, 8);
|
||||
|
||||
// li64(r25, 17);
|
||||
// st(r25, r0, ADDR_PLUS_NINE, 1);
|
||||
|
||||
// li64(r1, 3);
|
||||
// li64(r2, 2);
|
||||
// li64(r3, ADDR);
|
||||
// li64(r4, 0);
|
||||
|
||||
eca();
|
||||
|
||||
tx();
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,19 +0,0 @@
|
|||
fn create_buffer_protocol(string) {
|
||||
let str = data::str("0" + string);
|
||||
li8(r10, 0);
|
||||
str(r10, r0, str, 1);
|
||||
|
||||
li64(r1, 3);
|
||||
li64(r2, 0);
|
||||
lra(r3, r0, str);
|
||||
li64(r4, str.len);
|
||||
eca();
|
||||
}
|
||||
|
||||
|
||||
create_buffer_protocol("protocol Math {\n\r"+
|
||||
"\tfn add(i64, i64) -> i64;\n\r"+
|
||||
"\tfn div(i64, i64) -> i64;\n\r"+
|
||||
"}");
|
||||
|
||||
tx();
|
|
@ -1,27 +0,0 @@
|
|||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
|
||||
|
||||
fn main(){
|
||||
let ADDR = 0;
|
||||
// FIXME: Actually check the arch argument
|
||||
let architecture = "ARM";
|
||||
if architecture == "ARM" {
|
||||
std::Info("Arm Serial Driver");
|
||||
ADDR = 0x09000000;
|
||||
}
|
||||
|
||||
|
||||
lra(r3, r0, ADDR);
|
||||
|
||||
li64(r1, 0);
|
||||
li8(r1, 65);
|
||||
st(r1, r0, ADDR, 1);
|
||||
|
||||
// New Line
|
||||
li8(r1, 12);st(r1, r0, ADDR, 1);
|
||||
|
||||
tx();
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,11 +0,0 @@
|
|||
/// Act as a shim of a virtual file system that recieves one message from buffer 2
|
||||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
fn main() {
|
||||
std::ipc_recv(2);
|
||||
un();
|
||||
}
|
||||
|
||||
|
||||
main();
|
||||
tx();
|
|
@ -1,15 +0,0 @@
|
|||
import "sysdata/test-programs/hblib/std" as std;
|
||||
|
||||
fn main(){
|
||||
std::Info("Trying to open a file.");
|
||||
std::open("/file.hbf");
|
||||
std::write();
|
||||
std::read();
|
||||
std::close();
|
||||
|
||||
std::Info("VFS Test done!");
|
||||
// un();
|
||||
tx();
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,63 +0,0 @@
|
|||
type String {
|
||||
length uint32,
|
||||
data [u8; length],
|
||||
}
|
||||
|
||||
// needs three bits to store this
|
||||
@exhaustive
|
||||
enum LogLevel {
|
||||
Error = 0,
|
||||
Warn = 1,
|
||||
Info = 2,
|
||||
Debug = 3,
|
||||
Trace = 4,
|
||||
}
|
||||
|
||||
type LogMessage {
|
||||
log_level = LogLevel,
|
||||
log_message = String,
|
||||
}
|
||||
|
||||
|
||||
|
||||
// This is displayed as bits sent over the wire
|
||||
[
|
||||
010 // INFO
|
||||
00000000_00000000_00000000_00000011 // Length of the string
|
||||
01001000 // H
|
||||
01101001 // i
|
||||
00100001 // !
|
||||
]
|
||||
|
||||
// This is displayed as bytes in memory
|
||||
[
|
||||
0x3 // INFO
|
||||
0xD // Length of the string
|
||||
0x48
|
||||
0x69
|
||||
0x21
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
enum LogResult {
|
||||
Ok,
|
||||
Error,
|
||||
}
|
||||
|
||||
@exhaustive
|
||||
protocol Logger {
|
||||
|
||||
fn log(LogMessage) -> LogResult;
|
||||
|
||||
fn error(String) -> LogResult;
|
||||
fn warn(String) -> LogResult;
|
||||
fn info(String) -> LogResult;
|
||||
fn debug(String) -> LogResult;
|
||||
fn trace(String) -> LogResult;
|
||||
|
||||
fn flush() -> LogResult;
|
||||
}
|
||||
TODO argue about time being added after the fact in the logger or inplace by the loggee
|
|
@ -1,4 +0,0 @@
|
|||
/// a b c
|
||||
void main(){}
|
||||
|
||||
// Generated documentation below
|
|
@ -1,2 +0,0 @@
|
|||
(label "Documentation")
|
||||
(label "")
|
|
@ -1,7 +0,0 @@
|
|||
(vertical
|
||||
(horizontal
|
||||
(label "Function main")
|
||||
(button "goto declaration" (on_click "src/main.c:2")))
|
||||
(label "takes void")
|
||||
(label "returns void")
|
||||
(label "a b c"))
|
|
@ -1,5 +0,0 @@
|
|||
- container
|
||||
- horizontal
|
||||
- vertical
|
||||
- framebuffer
|
||||
-
|
|
@ -0,0 +1,31 @@
|
|||
[boot]
|
||||
# This package must be installed system wide
|
||||
init = "init_server"
|
||||
|
||||
|
||||
[boot.limine]
|
||||
default_entry = 1
|
||||
timeout = 0
|
||||
verbose = true
|
||||
interface_resolution = "1024x768x24"
|
||||
# Terminal related settings
|
||||
term_wallpaper = "boot:///background.bmp"
|
||||
term_background = "008080"
|
||||
|
||||
[boot.limine.ableos]
|
||||
comment = "Default AbleOS boot entry."
|
||||
protocol = "limine"
|
||||
kernel_path = "boot:///kernel"
|
||||
kernel_cmdline = "baka=false foobles=true"
|
||||
resolution = "1024x768x24"
|
||||
|
||||
[repositories]
|
||||
core = "https://git.ablecorp.us/AbleOS/core"
|
||||
userspace = "https://git.ablecorp.us/AbleOS/ableos_userland"
|
||||
|
||||
|
||||
[packages]
|
||||
[packages.init_server]
|
||||
version = "1.0"
|
||||
hash = ""
|
||||
repo = "core"
|
Loading…
Reference in New Issue