From d98a81b540c4eb9abf987e65f2b8efb6f0cca56d Mon Sep 17 00:00:00 2001 From: kieron Date: Mon, 9 Apr 2018 20:34:39 +0000 Subject: [PATCH] E1000 Driver & Net Stack - E1000 Driver Near Finished - Network stack added (Eth->IPv4) - Other Stuff - Things. - This commit message needs to be longer to make it look like I'm doing more work than I actually am. - Other things. git-svn-id: https://spexeah.com:8443/svn/Asuro@456 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- Asuro.iso | Bin 5111808 -> 5111808 bytes bin/kernel.bin | Bin 53476 -> 57572 bytes iso/boot/asuro.bin | Bin 53476 -> 57572 bytes lib/AHCI_OLD.ppu | Bin 15521 -> 15521 bytes lib/E1000.ppu | Bin 14911 -> 15234 bytes lib/IDE.ppu | Bin 8930 -> 8930 bytes lib/PCI.ppu | Bin 7889 -> 7889 bytes lib/USB.ppu | Bin 3725 -> 3725 bytes lib/bios_data_area.ppu | Bin 3689 -> 3689 bytes lib/console.ppu | Bin 21006 -> 21006 bytes lib/drivermanagement.ppu | Bin 8527 -> 8527 bytes lib/drivertypes.ppu | Bin 2813 -> 2813 bytes lib/eth2.ppu | Bin 2042 -> 2247 bytes lib/gdt.ppu | Bin 3580 -> 3580 bytes lib/idt.ppu | Bin 3079 -> 3079 bytes lib/ipv4.ppu | Bin 0 -> 2201 bytes lib/irq.ppu | Bin 974 -> 974 bytes lib/isr.ppu | Bin 1902 -> 1902 bytes lib/isr0.ppu | Bin 1981 -> 1981 bytes lib/isr1.ppu | Bin 1981 -> 1981 bytes lib/isr10.ppu | Bin 1994 -> 1994 bytes lib/isr11.ppu | Bin 1994 -> 1994 bytes lib/isr12.ppu | Bin 1994 -> 1994 bytes lib/isr13.ppu | Bin 2093 -> 2093 bytes lib/isr14.ppu | Bin 1994 -> 1994 bytes lib/isr15.ppu | Bin 1994 -> 1994 bytes lib/isr16.ppu | Bin 1994 -> 1994 bytes lib/isr17.ppu | Bin 1994 -> 1994 bytes lib/isr18.ppu | Bin 1994 -> 1994 bytes lib/isr2.ppu | Bin 1981 -> 1981 bytes lib/isr3.ppu | Bin 1981 -> 1981 bytes lib/isr32.ppu | Bin 1983 -> 1983 bytes lib/isr33.ppu | Bin 1983 -> 1983 bytes lib/isr4.ppu | Bin 1981 -> 1981 bytes lib/isr40.ppu | Bin 1972 -> 1972 bytes lib/isr44.ppu | Bin 3084 -> 3084 bytes lib/isr5.ppu | Bin 1981 -> 1981 bytes lib/isr6.ppu | Bin 1981 -> 1981 bytes lib/isr7.ppu | Bin 1981 -> 1981 bytes lib/isr76.ppu | Bin 1994 -> 1994 bytes lib/isr8.ppu | Bin 1981 -> 1981 bytes lib/isr9.ppu | Bin 1981 -> 1981 bytes lib/isr_types.ppu | Bin 1864 -> 1864 bytes lib/kernel.ppu | Bin 4277 -> 4277 bytes lib/keyboard.ppu | Bin 4479 -> 4479 bytes lib/libpconsole.a | Bin 102784 -> 102784 bytes lib/libpmultiboot.a | Bin 29040 -> 29040 bytes lib/libpsystem.a | Bin 155060 -> 184368 bytes lib/lmemorymanager.ppu | Bin 4138 -> 4138 bytes lib/mouse.ppu | Bin 2658 -> 2658 bytes lib/multiboot.ppu | Bin 3002 -> 3002 bytes lib/net.ppu | Bin 2331 -> 2471 bytes lib/nettypes.ppu | Bin 1585 -> 4642 bytes lib/netutils.ppu | Bin 0 -> 1835 bytes lib/pmemorymanager.ppu | Bin 4034 -> 4034 bytes lib/scheduler.ppu | Bin 3289 -> 3289 bytes lib/storagemanagement.ppu | Bin 3693 -> 5360 bytes lib/strings.ppu | Bin 4852 -> 4852 bytes lib/system.o | Bin 21952 -> 26076 bytes lib/system.ppu | Bin 11209 -> 12568 bytes lib/terminal.ppu | Bin 7660 -> 7660 bytes lib/testdriver.ppu | Bin 1392 -> 1392 bytes lib/tss.ppu | Bin 3231 -> 3231 bytes lib/util.ppu | Bin 8555 -> 9172 bytes lib/vmemorymanager.ppu | Bin 5818 -> 5818 bytes src/driver/net/arp.pas | 11 +++++ src/driver/net/eth2.pas | 34 ++++++++++++--- src/driver/net/icmp.pas | 11 +++++ src/driver/net/ipv4.pas | 81 ++++++++++++++++++++++++++++++++++++ src/driver/net/net.pas | 8 ++-- src/driver/net/nettypes.pas | 70 +++++++++++++++++++++++-------- src/driver/net/netutils.pas | 54 ++++++++++++++++++++++++ src/driver/net/tcp.pas | 11 +++++ src/driver/net/udp.pas | 11 +++++ src/driver/netdev/E1000.pas | 14 +++++-- src/kernel.pas | 7 ++-- src/system.pas | 32 ++++++++++---- src/util.pas | 28 +++++++++++++ src/vmemorymanager.pas | 2 +- 79 files changed, 332 insertions(+), 42 deletions(-) create mode 100644 lib/ipv4.ppu create mode 100644 lib/netutils.ppu create mode 100644 src/driver/net/arp.pas create mode 100644 src/driver/net/icmp.pas create mode 100644 src/driver/net/ipv4.pas create mode 100644 src/driver/net/netutils.pas create mode 100644 src/driver/net/tcp.pas create mode 100644 src/driver/net/udp.pas diff --git a/Asuro.iso b/Asuro.iso index 89d65e7bcc283916633a1dcff28cf0c0d3fb0168..9641f8f91d55a38fe755ec09ed83361ed13e3972 100644 GIT binary patch delta 10465 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 delta 10407 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 diff --git a/bin/kernel.bin b/bin/kernel.bin index 426e2f71cb063333658f28ce273ab42b7906c6ad..34171569af8ab0dacd7eccc338be35592de88b7b 100755 GIT binary patch delta 20582 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 diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index 426e2f71cb063333658f28ce273ab42b7906c6ad..34171569af8ab0dacd7eccc338be35592de88b7b 100755 GIT binary patch delta 20582 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 diff --git a/lib/AHCI_OLD.ppu b/lib/AHCI_OLD.ppu index 5f9d50e552dd3ad8df04bd9c643f53a9fb1dc7db..43ff6399400c8db1b0b946da4cac013f32c1e2ed 100644 GIT binary patch delta 169 zcmZ2jxv+AA2uG6XE{-W(YlGIM+vmtU$o@#*Wtx^|8< z+quWs^H)yV%*zM_PLo$NOHF>jTsL_+lN6B0&m=XufQ=I!NgvpSa(2O|Rm wGtexj$=%EvlMUH)H$PwwWMXul9M1+(4bp*xf#y`Pg>nVM^to-m$#%jN0Es3v0ssI2 delta 181 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 P6MW;8^Z`!_^5g#j+sS`s diff --git a/lib/IDE.ppu b/lib/IDE.ppu index c51ba19ffc89dd87794a97ff2c3ba89d676b997c..dd1450751931030e162f041b61797d41b168adf5 100644 GIT binary patch delta 68 zcmV-K0K5Oz000DabZKl&qj%DN$ny1(bb|f@z a|1k)*ocD*Jq3K4mI00w{0R^+6207MT5Lvjt-YD delta 48 zcmca;d(n16wB+I|YvQlX%uQne0+!N}%$&vgK~bl#d+wQ762-y)((%df-Xgn=*M7?a E00#UPCjbBd diff --git a/lib/USB.ppu b/lib/USB.ppu index 5223d4920d2bf28824e71e49653f07db8afebcc1..c662b263637cc098b9364170c70f3d2757c28b3e 100644 GIT binary patch delta 48 zcmeB`?UkJn&7o2z_x5hvHNlC=S(0hCbC0p-ubjjH1T3W`nK{0T%P-ZP`1Ez-v*o-1 D(S#J( delta 48 zcmeB`?UkJn&9V5(n)quobJHd!XG!wEbbRu=x5$nG2v|x>GIJK|2SuH}?zv~;wx+7ug%O&V*mn{(vr-aITJR;oxbk5XJd^z7o-1V2X09qxsOW) MOiFD2%_Zy(0Q)ExB>(^b diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index 80c919dfbf3e27cd7b53405291e17133d284d0b6..e19dc42a1611936a0f59cec160bfdc2f5094eef1 100644 GIT binary patch delta 31 pcmV+)0O0@6LeD~wbqFMO9_`(R))A3?9SBXMchY{y^7XNztsw2%57+tY6ldZDx^u9SEZ@Qd-N`NxZS5tswaV4{QJc diff --git a/lib/drivertypes.ppu b/lib/drivertypes.ppu index d65bea0d737b288c055895b0d6d3b343a6408d64..4df11084931ead64e6811837489ffbbe782908a7 100644 GIT binary patch delta 19 bcmew>`d4&9Hit@?+}pct*912fcX0s#T8s$K delta 19 bcmew>`d4&9Hpk*CYvQlX%uU-^+{Fa|WS9x0 diff --git a/lib/eth2.ppu b/lib/eth2.ppu index f9bdbc8ef105dd0f6121f8f02f1761e572676f39..2a81f1553de1e19aa365e8a7f15db91cbf786b96 100644 GIT binary patch literal 2247 zcmb_eO=whC6u#$8W-^&XGtnfd7^~@6e*%h$f@C3$9mvlxZw$2y zH-h4-3wNd9sx4Mm(oK}o^X#AZ`|Io;pfkYHKR#1raMnNn6wgz zB_;}EMFsObB}E#whg%poX`j%3TzeWal5Jj4Zx--Nk)66S`(qIT{Zi@S=|c5x0y=>pue@XrDQvKhvDEn zNj-^U$t{4@v)UoH2T-(r|8~2e>Eod9Yvn`uTx0+2@fY#~JiS_{b{}<*f~%p(|C$J2 zajc_RKEFpz53zdDU~FUzY8=+9>c`cp^C{-*iAj4ibB?1_Cbz$LG@IEsh{((`DpOw^ z$?i$zvYGTqdf?!}-2>?Z+`C^oPDL zdBgXGoaADPQ(-Uay1b+l%Q){Msx=J7L(~~f{4Sn3s9B+g7a?7|wy<=e!bEkIucO=4 zX$6C>RduX((#4aqkfHwgOF9%L!`3q+abLBTs*V`?mXdp_fXZ14UdO)%F`q-XT3M`M zamzB&Y#DojQ=~#)gzn;_4!Ew!pjkP`frAT6YN@pF{BM)KN@1!{ zu2$tDw3o<`R_;x45`%{abE#3%YTU)YUJ5p3GmrT#%>{B9-|vHQwdxP%yB4U!w-4u) zF$|@L5AcHp@x99NqN4LIi1)~rRbg~4527;aHqii#BzTl5poBumWV`b@RPZQ^A7&(CHz{#m*aD( z88Hu`;gO`1KZl8I5QOfyk)$7@&^>~RmF^Gp>(QjM1${hIKFwhD@FN*g|Ad0_587HZ u>EwS3kwXJ%L}tkP7Z~L!8VibaB+)mNP;J6H7V``kMJm+FuukT6Qhg1tuh}F3 literal 2042 zcmbtVO>9h26u#%pPp6}$rJYzP(hL=oNEBO9W5PsBO-Ct>(dwg({!BU(VMpvl>_pgD zuo5eY*ot7mMg)miiHMC@S(G8;`_6m!b*6+SPIB%&_nhyYd(OS*+}GcKaPyXJ;frEI z=3#%QdD&ph>&LwxKc$ZESYnJxfJqUsNZ2ipcZVq+q_UZk6QgodailbS@%fQnszTAy zxl-Aky7lUA;m!4_lf;Im-SVa@x6fxQ@0M{L!@7K~=$2Beo<6_vy7+_2h7&W>rI|_h zK=Iy_ZC!WPQ^zPI64gy+94z>`MB|eaqeWGYFd&j3c8oC{8+DB9IHn^V8OgPATtP?C zfuVtXrZ2WHlg|(JX9h|FORE?$F-RdGLSiCBMj~9nP-C)~?en^5omhwV9RZ;jp+B)M ztk&DJMhnqH@-vMjUgy<9>tpbt%^GyDNfXrE)tL`+tFH>FAzbUa&AM*MQt7vMc7@KuZO`zdsQBq!-V)!9RDvU%JEGDmvf6|`> zNy{A9Q`Dsh&VnuVQE+g~E!t34y>M>SGo6^8C|9d82v#w*Kufv= z#se4X!t8W5VT|V76KB#p0p4K2m!T$I1*0;x0GtX>PEriyCfL#~3X9795rB`0mPC;I z3P1PsU~+JOc9$l;m{h&+m%>@JSQr~AkHBe*4gW4T0o?~PSMOZd(vf0e(wzo&jm177 z5cCj?RC$cX`K@hNLo4lU;J9~NtXh_;x)JjX7KS7V{!ZdKzqQ;kyc}M?!uA3tzEf{8 zt^-R#U!zQUoR?KHvNV9cBNFr;ycR48c2cOXCv9X|fcgL(=`(mOSlW@TX|j#&mw;{V fFR-mt6d$1x=+}pct*912v&*TLFT15!U delta 19 bcmew({YQF2G{@pAYvQlX%uU;vJd+myWKjvA diff --git a/lib/idt.ppu b/lib/idt.ppu index 7feb7486ee29950c83546879f68571bf54688a12..5de6603b1d90edcbfbf718ac033e7d19577dcb01 100644 GIT binary patch delta 36 rcmZpdXqT7}EvZr__x5hvH9-a-U@0xh%<)}ZeyQ%nr>`4JCUXM-_uCI0 delta 36 rcmZpdXqT7}ExGv0n)quobJG}rfTgq~GiR}WP}J$`o_jWyOy&jv2Rjb2 diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu new file mode 100644 index 0000000000000000000000000000000000000000..3e2c34eaf4399c2618caaddb97cac26d2e8fdd3d GIT binary patch literal 2201 zcma)7U1(ED6rOYQ(=@Sdw6-j0U5xPuD~eh{1Vv5b8mvuBW2OFuG`(mrHZeC_^~Hx> z*q6m8VHbQ7d=Ld+M1+0X-G^O7MM1;|K@de>L=Zu(Mv3P;_s&gH3iiOvJ@cJ!&YYP! zb8afNfBnWy-d{<1)IX_+Iu%fA_}SYdN8kOiy+aCaqG@+*iKw z-=>w$*SVqv^2U=DFZs7-p_DC_Og2c@5o9*z{H7ozWmBmc{B!))}kvt~z|qi*#&JD*Y6 zw|z{a@_A@32dUM8hRR$BeUXel1YNXg+}dea`hhizwD;1SeEFl}=`ovE)#6=U65l&7|Y8(b$fmp`ANod$5e*24qajbYP#v z@)-fH!8n32La9orTFRG-*~Flt;9`3@lIO{0)ys`D+_RRyMg$q(Q8DvV*?g{89M9!X z@SOE}&JS#bEak>eK$6s`9p(}B{KJyV$Z-CN>Sn};gcDtchrY1>)OO7J6;?i^&v>N zL~$Llr`a}ma4Qwty2Pcul%H)i(fq_(qtu`p4f z0-C8Pq#3&yhfob0B`n7uxi$KVaLLUgng)ClSU>iDj+>TWpctG>VX222p80K;D=SPE zs`Wbk&ero_P#4yQ7{SDFA`{Jm*5JX=D==ZxZ~P5 ztJDwvRSoj@I`lcE?mZ^n2b;Rx)a`asH#Qm_O(q7T2a@T*@9h#tzLJ{}!H>yb&Q9d2 zId&SBJmDIBi($y$-0)iQLo^~`?tSHK(VS%NkDB{0qmVn?8m|1x=+}pct*912vbF%{gRdEOb delta 19 bcmaFI_l|EuG{@pAYvQlX%uU;v%*_q}UwsJH diff --git a/lib/isr0.ppu b/lib/isr0.ppu index d52a928830d62a156ca4189fd518cbd73bf2db71..60e5b98bb6dc2d725ad94ccfc2a0a262fbb41044 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr1.ppu b/lib/isr1.ppu index f9d3b583f380183ea475b99e9fb15295717c8341..d1e73edfc46608f067d5f7ba9f62248473b51101 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr10.ppu b/lib/isr10.ppu index 26aab93f3d4aa4a52d2f58c90d305f8dd100f9d5..9379dd8941580573b7d567c891e5e9af70d04952 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr11.ppu b/lib/isr11.ppu index c0b34fe0ca7bfd991c8b2977d46fa47872fcb871..482ffb847e5911e0d01142323d143ec7587781c5 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr12.ppu b/lib/isr12.ppu index 872089368765037f5c5d88b4fe371db0cab1f442..dc3749889aaae3810cb7773d1f8134feb8b72a90 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr13.ppu b/lib/isr13.ppu index e09e125cf716c374b7f71742912fbc79ada2d194..e24abd86bbaf89b7d648249dbecb4d201132d8a0 100644 GIT binary patch delta 36 rcmZ20uvTC~yrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia*vbw70QL`m delta 36 rcmZ20uvTC~yyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-v6USF5JwLa diff --git a/lib/isr14.ppu b/lib/isr14.ppu index 896d183cdf3ff61164b354d7e6c4cbbf6e2ca76b..d7f19467eb29d2abe2ff94053491498911dfb420 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr15.ppu b/lib/isr15.ppu index 8513cee17e1a5c2c1362e396a84e308b28b9b2fd..244b1290dfe282bc4fa72ff6bc590d18fa8d23d3 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr16.ppu b/lib/isr16.ppu index cf44921f03a325aea5e0747d1d69cf24a420f401..0f88432428dd4f7473509a654a53f8ed023d3bec 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr17.ppu b/lib/isr17.ppu index 13bc7771fdc5fccd4bdd0cae07fa48405895ca40..4a5cb396a250d4cee8f99cba8350a4078575cb8e 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr18.ppu b/lib/isr18.ppu index 8e762b6fe247445bc17d196a152b91b171f213c4..ec0fde94a7ee8625cf11aafdcd42ed40d4c33779 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr2.ppu b/lib/isr2.ppu index 7a4adc00e2a2d33afff5eb9dd24f2aef9b6b8b37..33b56169c69a210f26e2ad3b905666ecf117a0dc 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr3.ppu b/lib/isr3.ppu index 161daf38cb0acb5dbff0158df14ff4ca5d8b821b..2cc07a547490b9ffe2c9b7c3ee8d37f454799fe6 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr32.ppu b/lib/isr32.ppu index e54c83c649ab357f8210fc2fb18b76da244d38fd..346d76ef73e0432536347caa0a7499a8eb22573a 100644 GIT binary patch delta 36 rcmdnbzn_0XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2IaaAyYq1i}w9 delta 36 rcmdnbzn_0XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-;m!^K6cY}| diff --git a/lib/isr33.ppu b/lib/isr33.ppu index 4ff1aa1684b075f1e4bf355287365722153cacf6..0fe5348b21c9d8efdb2ebb56b857d7ce1486ca59 100644 GIT binary patch delta 36 rcmdnbzn_0XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2IaaAyYq1i}w9 delta 36 rcmdnbzn_0XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-;m!^K6cY}| diff --git a/lib/isr4.ppu b/lib/isr4.ppu index 62edd6aa0c53c8376cb0d1701e2ac5f150e9aae2..d6598973384a8b238b6a5541256e8262ce26dcab 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr40.ppu b/lib/isr40.ppu index 8711ba368957c0e93901387d317fab79ea83294f..0dc97533e991927f524fa91a9a460354ebd4ce40 100644 GIT binary patch delta 36 rcmdnOzlDE7yrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Iauwe%P0jduY delta 36 rcmdnOzlDE7yyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-VZ#mp5c>|M diff --git a/lib/isr44.ppu b/lib/isr44.ppu index 65c0a9610ec3bb5449fd18fd5002ec7c233b1dc4..08a0a237ffdd468ecee0885bfcd020ee38d93154 100644 GIT binary patch delta 43 ycmeB?=#iKZFR4-{_x5hvH9-a-U@0xh%<)}ZeyQ%nr>`3;Y#141H*aMO=K=s}{Sfv5 delta 43 ycmeB?=#iKZFS+>2n)quobJG}rfTgq~GiR}WP}J$`o_jV{*f28sZr;im&IJH<`Ve{m diff --git a/lib/isr5.ppu b/lib/isr5.ppu index 4c1971d60cb3c01c8507f23e623ad879f917864a..12d68a1145d946087c9337919097ed3bba49378f 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr6.ppu b/lib/isr6.ppu index 8e659b084ad93985734d126249214b28e18165c7..1950c967cdb3e7286b2047508448719ff2efec4c 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr7.ppu b/lib/isr7.ppu index 75f78e00095c826f0c311fe2fa5cc1018dbace53..47973135576e31a3f13b6131a709ea2a8062491c 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr76.ppu b/lib/isr76.ppu index bb32fd076c5554abc8d67485eea88f798e05dae9..6c2dc577240970a2ac3333975bd9515ddcdf3ba6 100644 GIT binary patch delta 36 rcmX@be~N!XyrfE*+}pct*8~}WfTgq~Gskyv`K7uOpT2Ia2x12S2igx* delta 36 rcmX@be~N!XyyW65YvQlX%uQne0+!N}%$&vgK~bl#d+ym-5yTDv7b_0v diff --git a/lib/isr8.ppu b/lib/isr8.ppu index 54e414e6d404a539fa6717fe3d340649f3aab480..decd6a2d6087ddf421401d3a08e009ac4587c462 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr9.ppu b/lib/isr9.ppu index 0742342334bc2456919507ea911b18ded7c8e7a9..718c54a82b343fdd02d330b8ce016d426e639c69 100644 GIT binary patch delta 36 rcmdnXzn6bPtfWer+}pct*8~}WfTgq~Gskyv`K7uOpT2G^b7uzt1M&|m delta 36 rcmdnXzn6bPtmNV=YvQlX%uQne0+!N}%$&vgK~bl#d+ym-=FScP6GINa diff --git a/lib/isr_types.ppu b/lib/isr_types.ppu index 3be68a80f926284133615649b0864ffd08ca8226..f27e1d7e643ed98a30dced7a9e3bb0f6abb2a5b4 100644 GIT binary patch delta 19 bcmX@XcY<$1I)_S`+}pct*914_-(&*-Qh*4W delta 19 bcmX@XcY<$1I>+KGYvQlX%uU;vf0GRWT#N~C diff --git a/lib/kernel.ppu b/lib/kernel.ppu index d0e32084a40db1b962941bdae833c367201d538a..63bd093183c1152ebfa31c630fc1491a206ad3da 100644 GIT binary patch delta 149 zcmdn0xK(k22*>*5XVVm1-sn!0F_FA`>~xeI69WSyGh1cih+pS&{t wy4Dnd1erZuT+gsQ%Q#)iRt(~^WEPZ}_&xX#8~172=3=ImoM3^?3OrL;04ahvWB>pF delta 149 zcmdn0xK(k22uIY(B_=A(pS&i@m`E;bIvpj)#K6GF%vM}kT#}l*_{y62Ycq4xCT7ZW zEY=T-I(^-9&%_D4Irv{XKKb2SWH&jO@v-f{=B76qeC8GmK)~VX;p`dj@8e=RVb21m wGgGgD1erZuT+gsQ%Q#)iRt(~^q?TkDT|MIS^tpDz=3=ImoM3^?3OrL;00eG0N&o-= diff --git a/lib/keyboard.ppu b/lib/keyboard.ppu index bd1c5cc3f62b2d428ea217f0c7715fa8690e3a16..dd4a22a1646e3c72337b068cd8f0352f3c4b27bc 100644 GIT binary patch delta 31 pcmV+)0O0@sBL5X z1F>)uyyy$oPFP6AbzM=({W#sW#zQ$h`) znj8YrYvaN#^Ji@$ZzFHS_eL9i+y7QCd50KDvw*GXsu-+1&2$)PX-g0jh@_dp)fOKw zPQcTlR$43d({aZfoO{rZg@{`}$%HO-l9I^+V-I&kQ3!RbdHCM?`qb`tJI#ZK_S-ST zz|a;p%f;cRs+f=Met1Fay)mZqo`0r#?aOAczB-L!Ug*|D1{Shs`r+4P0KGEOl}HL~ zPPd?m7rQeXg8_U;{gL13<>_9`r=pkRw-475JEIn;{`3O}#j#e}K(sGg!1rZapz;ci zxSY0@!t89j%i-L6F<@U#7RBUcDG9Dtk~rvDnJ40?I-~V4yBflz92eGgC~fHQ>vu%x zjK<UFJbC#d(B{F4!5(5{BQ`Q4a~T!^zSeOrn-__&+kcPZa+HrY)U4gUd$F|n2a delta 1388 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 delta 10240 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 diff --git a/lib/lmemorymanager.ppu b/lib/lmemorymanager.ppu index 40371b80e896eea538bce2ed77b2fe4d894b4aef..46d87a05d38486cef6c6cf75a08c8b22e53822f8 100644 GIT binary patch delta 63 zcmZ3buu5SPaYvQlX%uQne0+!N}%$&vgK~bl#d+q@V@RjAJ=H?ew<|gJPrl%J1 QzjS=^ySK=0+KGYvQlX%uU;v@68PWTCWJ) diff --git a/lib/net.ppu b/lib/net.ppu index a5acd3442b38def9699c8954d2cd43577e98ca8e..941e4a1b11cf896a5d0e41c7a1e40729a223ef5b 100644 GIT binary patch delta 906 zcmZvaPiWI%7{=eXP13YYyY(-kw%z9H=q9+b4Z(|Z#UkiRH~&mzP-7cLSk{&_&KAKQ z272&RzMEb=IdB&d@gyRGBI?f`^S-+ zvQsm{27()26-S`$1=xDDo7r0XZ3X}!*%{6(rQd(JxwrLB#wCx2|;`4l1z zJmp%oQ8ToK`qMWvV~>w=O|EK|)v9Za&tK1O2LGym9Px&w8;zasQ_oH|ceguD1Fv+x z9Y>MHFvUtZfj)K($KwG61Q~&P0+>b+U9=CfhnPIp??fHM`+t?a#6$7J{hqs9E5v@{ zJ&dzkuJS2~YAYACY9*%{#&xy43g}IVykTmBN5HQ*-9G9kO}lHvL#t4lKb<3#CEPkD z*#J_C!bp6q3Yx$BiU~tkbS~zpDq*rx|RP3H1OVAO{#ly5pxjFtr0EYKsBK?G2T!7gg m7}*00T9XPzdf;3aJV*PGT`@|l+io=y?P2p>>@wSt)BgZrGndr> delta 760 zcmYk4&ubGw6vyAo?oM~R>8AO$NNtVL7Hun$V7&^uwnfkoYDE!sS(C9WO=H+B+MFVa zCqXFVMSBtjFJ8QO@*o~W>BWPJp#Ot{-cHrZxi-^_g9XJ+SpXP#v@GsSB4T=~dR z^$vmpudDmurw&lM|Mb?W-(OQE0E}-Gr%PUU>*7J0pu*ancF5PBe0=VHez+*2M< z2Zj+aHn>XZtxAcLiF=qA9}=~kO1mV_@@C!f8jY)7Z52=#i%KD>Q9^ak9CxG;C_YYz zZ_4@HkmQ$m?Zysoh(*=MN%2BmunbDGmRt8i4{%s$T47|EB(3E(cvC86&Btl6sV!K^ zLDUrA2^|?gO|hH#SQ2;H5*^?Ro9o(?#R*w`6n-RB-ssGKPf2IHc diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index e2200f0e237c11f9a8fa83468d23ecb00ef2ee7d..2e3f02d09656c395cd32b24cc2c07fbb4c178429 100644 GIT binary patch literal 4642 zcmbW4OKg-?6vyxR=GB>YTA-!8K43buJPHL0MR0+!^pS$JOgaM*AsMEffler$GBY88 zg&{G)g)WRC#)T#tqs9#;E{usTT(H2nV&j5D7rJnxi5ntNEuR0mj~Pm>mOHukJNKU7 zJ>Pwtd%ioV)XCoc2ZFDW3aD>WN%d%@Qulry`Ly}Z-2D|wsRNvmqMV5uW(w8n)!9NN zi0Vlwm{;UAS;g+zTxImT?_X&}b0A!~TB#N;bza%@`;Rw%0IFJ`2*n&<^0-0haPxF= zV%8~gcn1B9<4_cnGB0JLl;e0%D{&c4pH63nMn7l6v@!(q9;pV_1Xzq(;e}dT zn3Q0lT2o*Nj8!3+3P`6YDf}!Sv;rGjtW|mjr3_ir^$Ci_W@A4hwU*`Cw>FPFCDh(x zRZFz=TjrP*mVoti8e~##eNVcMGL4SfVl-JzO%SB(*=D-Lz{2)TVHsP@Rju%JUrja% zAGg@PCH7ML0!ar?%7B#GP(ySjKxOnnyS#+rT8@+2Pr2K3B~t3U`ErBst~~*K_96=WXSu zmqh2#Y<9XZ!|Yzm`rL}t#kq|!$ljcu01hZ#goFv~5lK%&#KntcOd!k_+yo*?J1D#! zsh@Lg0thX30+C+J4glnIoO5jg?OdZBn9UexBuwBG1lo#N$v?oG+uoNsm=~$WlA2X>5SDiGJ5i zBW%9P`E^rYzD;zrK7`RGQ1=m@1Nll-QDfBFe2d#`O0eMhh}eNjc~Vi6quw#dUVe&; z`AsZEc^NbO*%>J+iaYi_!=7_&ypBCyQq=6&j}40zMDphJZo*k^NsHdGFCkMmiXQj| zb`c5B#>~;wslK|M4AT5s(PGEEGr=Wx5)OV_SiO^XSiWoO@ERnn-*R>mQQ;msa>7pj z#Q9fLI4$2MdfA=Chg!VF#}y!QrBJREOMJvz-Fp53+@x*%^nCP*O^KW9c+lqHhX$-U z$SQ6LWJ+m8s~yE3X-QbB9h^NMw}Pf>shXRH#VmHe-QkS}#|Sl!HK@bk0BaoHW^im6 zw%7Ala~Ut@3p3T?`C_3g=GQuYqu~>dhr`tKu)ognTMfURsU&C5U&Cc+csh5XqG-M2 z_81Nhu7`~gH4T?@7cTKovM0`;SG2+5hYXIupWy8I>$nVLGRGD9j_Nnmi>&Js3Sqh- zRW4Oalci}z8y$Mgpd$?EjoZLdY-DgeJ23K+EW#!SrwyEPuwM^j1vWeQtbt!#Wm`xS6HMiP%K!O7*q+?+ld9Aniwq0i@OnnZyB37WnZxTwW%*Z(rBBA)wk3afAle>cFy#r3Hay zzr*7O$JQn|dwvg>Ioi%wl&IpEOE2E`RtuRgAJ5ffMxJ?F^nhD78} zaQ1uzLmem%I;z)D_*7`B7nB5wLykIVC5iu%!S&pXpO15>kzGM6-!lzzz?3dG0`fGTw?^^9BRYJ>Y^=e zT`4xMGteaf%0=TB?b;yd4Myd%){YNk{K)u;{=tF%bS696KcMJvNFdg{$s8_NZ_AV4 zJx5$8_!d7Tgwfv%cNxf4=yzf+H%(U-)w_^AUeXmvXJ@=L*Ybo NIEs{(%7TI({{t6_qDTM$ literal 1585 zcmb7EK~Gab5Z>9+M_Zs20b>+HtW^#qDnSxYCI~%{XjA(hG2o$jw9nXB$_wvBQ*Xv! zp;vFllNS^9;6b_I$*8{tDW=Xh?Y>geV4P%jXJ@{h*_qkhVsU+8acSr|shIjy%&MfN z)cnle{>vZ!(Xdh~%?wI16D1m67&d(`7{YQLh6zY|)EKV#Zt(uu{^lIiF)L^Wp|}0& z`RGJ)K2LU_2XZ%n1E3QUf5@ zp%n+oI6^2HNk)Bq$B=QF9IWj#9}Cp=J|Z3^0v$bQL8p#05!mJ0PBA<_2lBTW4X7`{laVVC*%6 zonbBL67v+pAnR5q0rU`oKuF-KNS!o996bC-0=Q670x3BnS5E2&-^MSH* z`i&Y=boc21kS28V0K8*1^Z|nAK4#=6GU~tQv8ZXaMlEc&=`$ntfT9eXgLHbWu;%2- w2HL*|M>^>_iVI-+ng!od+iCoV>74Oh#xW3EDog5XcRRH*ERo$^_D$6O1E)ZxPyhe` diff --git a/lib/netutils.ppu b/lib/netutils.ppu new file mode 100644 index 0000000000000000000000000000000000000000..14a193a337b294a7214562e9398d27ad58c1449d GIT binary patch literal 1835 zcmcIk%}*0i5P!4VmX?nN#2TZZq}H!Anjl~dF~%ZIY~-V`Es7pUg*`Nuwy*`{Y~nxR zA7J9q_y>3~9=v-n;o`xYM-`~1&TqDFThs_1oMdL_&DWcGGdr0~ZfJNk@Pw49UT0#; zY*Xs%r{Py)k9W7blu}VfK!lMfTym=G)k4t?;FyD=7o5?l6_+b{_u1Qb_pd{2hTJW; z>a4^!PJP~f`W~hVA*x#y$Nli}_H*l7{tJX{OXZSVE;_T7mv2VTzc>e3HzNhx{lH~| z1$_{PtYYC|#aHB!41hRyreUE-SW&ysWuYBH=kTFEVj8j+>}+akfqCjBMJmjk$qG|5 zBajAhao_-bs8!$D;@`qHLWP64LkT6JMyqo`dqn;$-KTEm{GZ)An>R5lPh#mz>ZiMf<*$1}O{g=`AZ4L=WK$8%%Zu4wi!7jf9c5Yb%8FY!Q~^rDl( z9|1VV$fG5-8MQK>C;`twMh%Ff4pqlBHXMUB_4{=U?yn=AnIHN0Le6kZBZj}iC{z?h z`gI+ba2vx_#%3Lxe4+%V{U)P^2{7Tq^kaz)9axjq?%ky5f?o%>A~l;!PBt2$Kk@OI znaNagTAu$ejX_#x8I2hJ>;N}rh=1=sUC|T^0rQNg$TP+757R4bDh=h_)IHcSd$A4;Z!9=p<9Q)hf6wv03W^t2DGgv|^txkJx2Vu4 zisA{nH`fYP2V=XuyymzrPoFmvq#m&vLq*XL(;hKQXEsKB%ZRpIWqrR`O55=AtLyn9 zKZ4g6QfM`RYN&#acn9RB=m+v3zZJ9tlP$;+Ft~wZ1IED{d`XY2TP^vV_xrr=AKj%HZt>2x-}s7?3#95fyJMxzE!_YtvUI7hMct+ke@K2pg4U%|r=$EB7#J9t*@`QROHy-H%H-bOZM!B26k}j1Ey>LBU0i;t?!>3B I8@nv{0UTu&Gynhq delta 53 zcmX>ke@K2pf|khF6H$H)3=E9SY{iwuC8@cKudIo`HZwO3D8|52T9TQwSU)K0^mWfY I8@nv{0T7)OG5`Po diff --git a/lib/scheduler.ppu b/lib/scheduler.ppu index 417ab81aba355bdb43def56a0c1d4c90c872e710..7ef9add6e6b0c07b979d5f9c9a6614b1cee30e16 100644 GIT binary patch delta 19 bcmca9c~f#iI)_S`+}pct*914_XYl|4Re}g< delta 19 bcmca9c~f#iI>+KGYvQlX%uU;vpTz?JUycbr diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index 2cce6119215972b7badac89fc0bc95029dccfa52..888de8d3a363ea6b31217d11328b824caf992727 100644 GIT binary patch literal 5360 zcmd5=eP~=K6#) zLU&2gBn2XjM>UhRim@6yT4PV6J@xd~ssdKUm{Q>wN>txHP@@(;s(=kj-JlfwsTxmT zjZyWUsWlCrD$BGfWJu{eV)O;o*Rc6&w9tUpVX(fc!Bz!{vL6j*@W;1QsxB2yb#%hh z+oU9DY?_VeVSFH!N~(RRLlRImK}8!C)p~8DTg<>(l}tOJ-EUyTnvWK~vCu9xQ&?N8 zuc2)-I7)YGhN0sIsSn`SV7-J1RKw7rweFOo#+BBvq8)y0&4mAlTHh!!qlJ7=?QCk_ zQQVz&)T(tpLb)xk8ip<=?(S9=C;y`)?~;B5kL=~rZ=Wo#R7%A{!7U}G;zI824YGmS zA@J6~wynSmsZRnpq<~?Fu&_mp?_Pd|YZ@nJCKEuOR!HtDT&h}SCpcfML1QOB#+UXpJN3I zJ=B^$n=iQf98{HofM7s$Gv`u3O`@HA(@%VKFK9zPcU8y(&Ds_rR#9imAQ&ggm^T;g0_|1Y_0|$@ZdKL zoYR-ZsdAdgW9;s$tU#eVI?^efRAesd7*hb3P&r!h`A{xFtc*(@@ND@8RhfeD!1RNl ztz|V!Qk858k$=!bKW~tM|rc@lw3O?aAc+)hXx3x8-TjF@q1HWy+T#2;9iE^SeaW!NY3JCd#2Yt^# z=~<4?iE=qK>Mg1)ui8PJ+pxxDW<5aJM zmBXAqSA0el@7t*BKt7?2%6dkP)EhM)pH3jrpU+IiFD54Av9y7h@15*r2Wol`o&*=l z=^aC!*{}T|#Z@3Ut*_yYsHxN4sd77)!^~=KP=hI7A>VXA9{(ng&k-$GTCB&%>IXL+ zPiH31oik%e#bOi54?ny^=*Afw1#OI#-11rh`?cv6iNw>iVnT>#@qT|(aPu>}mR%1# z068Zmue7567As^}sxfd$OI&B*M{_`1$!;a#)~oKTLUsgI3!cETk3RKZTZQb@V&)^V zk0G?TS6<;%OO;#ok@YUILhjZw9%8bOBdNQ~;&P}lJPTwWx01WAv_eMw2nI8}^=2z% zw?+(5M}*r$N4l0drg8H|LfE6sd;#9zUN3vOI(=EAKV!W`m!W7NCzTKA&scu|Ah9t# zvbO_tyNvZmfYIGrCI2b#sq|;8KLL>bAHX9cj8jL_rW7`9+^5I#8ldWbibxk=P03{9 z{7kWkEN6eG8tdzjbBf3ackC^Rn(XURklz5Jdm^wdd66;Q(`^qnxCLg;b2+SGfAnBH z0c&>KMLe!ye*uhoWP}G_Czg;&nXI}~`r`06;E0fWj)I2Ge-RplgXv>B=#ak&Aj`k- z=Hiljj)Ar^Ye}g;Xn=mmqQzSVeFtwkMs_om3*=YwScebmtxbw|AyvWZJ^^V*$-SJ% zUp=La9m^RDWLPzjSE-K6ZY6_s)8NqYC-iI2E7*7bNhet^)Q@7!5qh+T}+*;*S zud<(Eu8gnw#_)CW_jMA!2;}#*vEHF`xX#SXR3i1M%;fo59F9}5WO8DDV)h(Pp`GmH z`1N6P3S4M4TgomYWHWmHVQGKc82w$maoDIYokH5pm{n?$c8`JUiPhVtC)SMKlBIYF pE&2hK-Q%EbxqSIbX0f=8Kk#zs+0Lq0R98S%dDh7kNL`Ve{{;;KfO!A_ delta 1460 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 literal 21952 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 diff --git a/lib/system.ppu b/lib/system.ppu index 51fea349cd21c5e2f843a6bdc564d59377a006cb..22e6840fd346a358cad9ceb3b642fd543c8dd23a 100644 GIT binary patch delta 3786 zcmZ{n3vg7`8OQIr*?Tt$>5^ST8nQS0yql~EYDnZE&zJxWlHigDgd~I{O*B!OFkwM! zTUTp`QO4;2pHoxXDb^}lOL+w$VgyR5r6YWRX$JQP9e>F2V~#)U_*Wf&#PLTRKkoR~9DmI5uRDIi z@ozZ(xZ_VSjjm(`>5HtwiZh61VGW&PC1;&po`@MDcFu`)jV*G0rl$l+2)jzyCSjX} zZ4tIr*wwOGJH%6 zd^SDh%b#O1o|XUD4PFuaqWEL+df01xCHPI?FH`8&=%UX*H8V6-(`eFHoXU&^#b77j z3UuUPRUPR>v>(f)9(JSeXp2Mes2Z6bqBVb_Aak!Nq7fh3Cg+y9kPf zl%dOR>x3Ppj$2w%C(+V-D>b&(ZJ^12&xy%pn{QCJe#33=Oo(#RqCJj?pC2hYB}7#a zeJw58>xlR{lA_-VQ8h&QLd4f}$Wd`8Ri}mOPN;54ry6%e{05Ms-wDwyhzir9i$RIgFx(~pc(>K-SD?Is=-BI^n~Bi z11|cxzeKlPbkZM+l_Ojta?XLB(mXIcl59?n3=Z9|MpnAWutNH57nQ*+aM5xrs@J+` z2)%k2ZMRDFl`h(E1@#seU4(0Q(N!y$>PBk0of@RhuKjkhzjk;ww=he1lf;;-c`xPp-gX{p! zgFQm+c8E>TckC!TMZ0Z_ouLW4jJ-vd?J)ZznXwpqpJv1=*d=Or&#xN zvF@i}-2)^2n>KGqYHZq60NmlQvZmY6Gx{FFfz?={d>me*tFZw4lJZL}-DT44rG7ov zq!sApn>1Kzbrj-(Byaug7;SEL&Qj1La$BG>_YR(W6X;xxg=OxD8oHAYKSS67E&-muYyH#_pEz5TGpBD}bih zXr-27wGxjj{40e~h&oA+E4o)vRAPywrxpFRqA0~uNzW;|Pf^rjnV>1{qQd(XMlrr2 z2fw4}0Yy=bdPzS}^q`_B$8t&kqUa$-aXjyl^kYF$e^xN2Fv_(;;?LCJ!)aQD51j@{ zKUefsMNzFrNhcLOqA04hQc?|H1@b~1)wGnn5>+VIy%L)WkE_8bS3=S}MPE}C)mkN~ zPtjwFqFPOo7Ag9=qA8TCS>k}g;uD)6kSdg`MN(VQH`0TvQIA$h%N0GYDC)6V(n?VI zsy+dl-Ga=GJ)0iXSX+LNcs|Wmf-_u@P=XHmp|=2B-lS*2jTSk2oqT@PDtL~=goIrZ z*1KtU`7D1o$V%wazb4++v+-X=4qYuTrko1zls3fLd7Sl9tfDt?9?d+vd2Msc(#G|J SLxV{G`6b1)Za2MHVgCoVdoR`i delta 2644 zcmZXW32YQq7{}+mnb{t+rSw<|JKg*0f!(%TaEL22^OU% z8>V5AI}~OchZ6$z=_XicOa^Oal3_Z6`y7iLyBy|>wQlT(2 zYuMkV7)l=ekx^A>v*3!cE^-_r+T@eSj5rlTc34>-qK5@N)lM+mREVO)n8+O!5ky>c zQWq7WC^;s|kBV4(xTr@L6{9Fs7e(;AD5_$Pt4`^v(Wpv~l^P!vv37FN`?_chii|N) zNmRtnx#+Ym8jGS4F;QhyWMHC3#f^j>n%_?;~i6k_LtkJV@P$GZm56FY=o|{?Q)W|vnS!_7Nht^OT>}+ap zkw^;B=d~W`NSzj7Va+A)B&?Z#;Pp}mQ`Z_X-QJ_==m#+}XJCMO| zW{vKVVVEVG?w7%5vAPc9aJF7^9NHnZt-(;ZHXLdTEESo@W$3h6>1i3ZqwANU*W#cb z%5VeEF3DT1+4QOm7ORC`lc5aV*D^F(Es>j8nXje{E60~VA8siR2HQp1+k#JFd|oir z{0RR+@N&khf`O%v@L!ShZd4#onEjsuR@^+PZS{p-xJqAPV7BU(N z>?Se+X4$Qz4BG8xG7Vn0+ej50MLP#R!;$$gV0W17#f9dw3prN?+y1@n%~0Ub$TFyM zSjh@lj`2$9!uSO^;>e~iD{$FirW+Kv>(J;X1>&7r*)~zHUa$Ae;K}Vm$Q##yFu}R1 zt-0k9!CMM6JMHv<0vnt*+O5D5bSD+Kitelezc`)ryaK~rZu*e|r7knQtU!ayN{QlU2ka&3~JrC3S4wq=ywX-Mt4VnIJbokDByKl={*Hzx*ha^ z0ztQfNC0jxF+jiDL-5V#c9Aql^k^gtJRS=%!xJ7mal$f;bD;~Z4-TUp3zt1sG6}x- zI7m4R^=f1~i`JGmV<;Rt=+uc3`=4YhQ1 zwudE>IaJ@BA+-Eq=t8VEufhjbB1Zl;Tn&vmX0jI6j{SyJ@cyG89Stab;|@e;A|+IvOnR+h?OA-?kLJoTUo{#=b7Qz3xv zlnNVjO|(yiL%CYyg2>#?GX3nTST~nvevFi_cL&lqowCAte7&Cvyi?#}eE;Wj{Dr`~ z1ZKB*6vtm8*7$~QvtvB4HXvWWz$;MqeJ9^{RT zP<)Z|w(rF{>fG|SFiv6uZ%w>_`(hA3J`*`i5paJD;`}CYm?7XhF^J!q$sCRp@IWL+ zu`wl_S_OSK2Jzcc%As4pgE9EHM9MhKN633}2%&+kr4Uo6@SYS2dN@Xld=ZJ1b39() zBLZV5DmX0>v|CVIP$j38f*utVAB3r#&J^@mj27cxhG~rA`u&Lci~K#r@pU-s>c);| zB{H3Vu_MG{ z8jpW{5@3pN1kCfL4Oxw2YuGrxSi`<1^EnKYoV8Ea)=jN$XbZIAMxMhzvqV~FfO|gY EKYKf_?*IS* diff --git a/lib/terminal.ppu b/lib/terminal.ppu index 952ccb1f27453eeb83fd964100dd367fa9963794..50ed3e66a9932559650689ea29ece21087f4f0c3 100644 GIT binary patch delta 31 ncmaE3{l1x=+}pct*90dfD|4jT&OOGSzjD&XK0zJ;$N&t5 delta 31 ncmbO)IbU)@G{@pAYvQlX%uSn^tjxjx((%df-Xgn=eS$my;!+Lx diff --git a/lib/util.ppu b/lib/util.ppu index 1a2ae2676d206ac1b66be64b4f16c4e2c9c466b9..924bcde8edfcbbb275e6010f640c175a91f51ce0 100644 GIT binary patch delta 1961 zcmZuyZERCj7(Va4z1>(5)@`@lx^>-V86N{S9Ai!lx(^(S`(g}mgQSk`&K0`0wnaeD zVbBFM!LT>_hnT1sk*EoigrG45eh@^$B!m!*K@&Cc2bv(k1f4{mb9?Vn6YtXJJm-C$ z_dVy_bI#rEmh0`6y}cV()HgT|kWj_B-YW6Q!$Nc&+jZ^bukQZQDTGKKsjMma{KLzG z%h4g#nc9;|8)Ly2%742xal?JY*zdfN1HnB>MN|K*R(M(|-Z#i#N=ae zRnwpu*=%O4(Q>Ju+qD56Q|9mq&3kH8J5AJt>L>Y}*5Ws-dohBbza0{{NN%$GUS6Kt zMO%1Z?gTx{>YNEO_;uiVcITa=O?(Zwo!NDre&^A-cj+(Q^3Yv+o4e=Tp+o${{5!Od z>+WnSREKxg?jaEhl2F44_Xdkd?He&+X!ZqY&Bua|SKx3YTzD?cb#PmL~3&I7Dz zV}D0ysJE}9yT5B~S5MzSu(i3bt)siS^M6Qh>$>K?U`tO==i26Ob{ABP%Q6e`Q>vB# zovHZFWY`e2(3`1GqDPL0=NYtlLZ}&Y4I<8{5qmB@3iBe{JZPE2Xp3MD!lqO$1*+kA z6wW5wX=I$^A_h_pz1p-c18T!YG%^NryKPQbW%r<61g{)jsglPlFFrDoGSZ=Bd>0Zn z*$I2Cgjdl%f&@5)GP55@HE!TxOBXU>QsD>l7rBli_Ku9xG5%WLQBVMS%=UpF&)7~P z^qFb)e1nUNbuOLU-WMr2fo9PoUr@8DPbjUEr8C0PzXc(uwi#ckx{ zCrc86S_I_vAzj`XbwhuLprXv-CDEYrHzlRYYL$O2@s&5jD(jJ+3sj<5d2yaOO%m-Y z2Yo^6;tpR0ZQ$*|0e-{hrx2e28hp{`U%g{?tWr5vB(_aZgH4p=;E9*)P-|H)W_jB#lcN0Cx&rmO%uS~m2wVWaJW z??LsM>Pnz9k%}5d0$XeA$Dzx~lV_FGjo5G^ofK57Wwu_3Phn8-cN(o03c(}MXh*Xrk+M^3)*iY!MEd|3{c2iADxYFA}RkAb&l zB>Bnc%#wP+2TaK?zd75oq!IAA)%VIF{qnW!&T{Mnf6eNbNrx`?=Wv!|68tEiuV~^Q zik-T=%O7N^AAwKJs`5^Lk)@smzX-Kw)uT{y!tq!t9>qy&$m|3@mN-LAz`UUO?T^GF QxY3PdU6rf+RONzy0l?!(5dZ)H delta 1475 zcmYk6ZD?Cn7{||ZlY0{ryEScc*O$CBecPIJ?P^w6t?S$tEg5}@cBQ%sX=xKIYm;EB zc0*WkV}8&v>%)*L$XLZsZe{F)gH`Cjff6TjgMyABn?pe?sQ+_wQ|=8s=YO8x z|D5OC``nwg?z{WK$>d;LtlfT`giWj@YsLPs5R0wP9{S?D#B#R~B0V3DRz6jC?NAFQ zWYeaPOwXjJ7S}#beY-G~nNQDY%?<$1JLJ9iU#G$)q@RIR2L3_Zfvl_1}?JE_;m9+0avW20_f zP@lgvqID6^X*z%4h)@iBzlYg#nrcHSov%7|()oL5FYV#RhfY$Q&m$&yr|Tq2UU99^ znmz6xAA6eb>fR6Ito9@#T-`RYhM)+pwpR~j`Jgan$&y=mw86Gab zM$4BPyp2SkbC2&f&2dBz@}ei~?#FFDBX5=7;F5~Nx(9Md&dqCBY6qY7)Vs$aGlumv ze_D~-G7dt~GQ>&Cf;>N|H@QzEGjDi*<=M(awizxpGy3x6jG(4c6*H_AN6dAvV{{2& zYd}`1-HvFV$Yye|hKkk`ru7s?FRXF{Wj%#R(Q?FhO)m5A8%J0|=Az8f0FPD0Jn ze59{vENB-GKmwxGCW8Y{20QB?EHTiR`O_!Y;F9bOVM8a8gih5w`JMAVj

pvxAt z485xHt#Fqf0lIEMUqj#0xV5%Rm+kt+f_{VkL*r;&2j^-upKQoK7W^-?gClj18C15T z6#tdQ%L^R~wB2Ehtua^g$%a7ejQ_4<1bPq$aWx_|n?Rd;uGIsjlIF DHv9CF diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index 3eaa1c31385d588eaf7ec4f4f7619075ade36eef..791eb9f54714e4239abacff3aaf9f85d88b2790d 100644 GIT binary patch delta 102 zcmdm`yGwV12uGUj++*zdD<@5qanZVU>U2~v0|NsiGh1}eN+1Mq^$mPJn$iTo1lycv^k+Fw~(S7m-7KzDWEGA%<=;j41QbGV) ClOd=8 diff --git a/src/driver/net/arp.pas b/src/driver/net/arp.pas new file mode 100644 index 00000000..274f1318 --- /dev/null +++ b/src/driver/net/arp.pas @@ -0,0 +1,11 @@ +unit arp; + +interface + +uses + nettypes, netutils, + eth2; + +implementation + +end. \ No newline at end of file diff --git a/src/driver/net/eth2.pas b/src/driver/net/eth2.pas index 51ffe5f8..92ef9877 100644 --- a/src/driver/net/eth2.pas +++ b/src/driver/net/eth2.pas @@ -3,8 +3,11 @@ unit eth2; interface uses - net, nettypes, console; + nettypes, netutils, + net, + console; +procedure registerType(eType : uint16; RecvCB : TRecvCallback); procedure register; implementation @@ -16,21 +19,40 @@ var procedure registerType(eType : uint16; RecvCB : TRecvCallback); begin + register; if EthTypes[eType] = nil then EthTypes[eType]:= RecvCB; end; procedure recv(p_data : void; p_len : uint16); var - src, dst : puint8; + Header : PEthernetHeader; proto_type : uint16; + buf : puint8; begin - dst:= puint8(p_data); - src:= puint8(p_data + 6); + console.outputln('net.eth2', 'RECV.'); + buf:= puint8(p_data); + + Header:= PEthernetHeader(buf); + console.output('net.eth2', 'DEST: '); - writeMACAddress(dst); + writeMACAddress(@Header^.dst[0]); console.output('net.eth2', 'SRC: '); - writeMACAddress(src); + writeMACAddress(@Header^.src[0]); + + proto_type:= Header^.EthTypeHi SHL 8; + proto_type:= proto_type + Header^.EthTypeLo; + console.output('net.eth2', 'PROTO: '); + console.writehexln(proto_type); + + buf:= buf + 14; + + if MACEqual(@Header^.dst[0], @Header^.src[0]) or MACEqual(@Header^.dst[0], @BROADCAST_MAC[0]) then begin + console.outputln('net.eth2', 'MAC HIT'); + if EthTypes[proto_type] <> nil then begin + EthTypes[proto_type](void(buf), p_len - 14); + end; + end; end; procedure register; diff --git a/src/driver/net/icmp.pas b/src/driver/net/icmp.pas new file mode 100644 index 00000000..3ea972b7 --- /dev/null +++ b/src/driver/net/icmp.pas @@ -0,0 +1,11 @@ +unit icmp; + +interface + +uses + nettypes, netutils, + ipv4; + +implementation + +end. \ No newline at end of file diff --git a/src/driver/net/ipv4.pas b/src/driver/net/ipv4.pas new file mode 100644 index 00000000..341ac449 --- /dev/null +++ b/src/driver/net/ipv4.pas @@ -0,0 +1,81 @@ +unit ipv4; + +interface + +uses + util, console, + nettypes, netutils, + eth2; + +procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback); +procedure register; + +implementation + +var + Registered : Boolean = false; + Protocols : Array[0..255] of TRecvCallback; + +procedure recv(p_data : void; p_len : uint16); +var + Header : PIPV4Header; + AHeader : TIPV4AbstractHeader; + i : Integer; + + buf : puint8; + len : uint16; + +begin + console.outputln('net.ipv4', 'RECV.'); + Header:= PIPV4Header(p_data); + AHeader.version:= Header^.version; + AHeader.header_len:= Header^.header_len; + AHeader.ToS:= Header^.ToS; + AHeader.total_len:= (Header^.total_len_Hi SHL 8) + Header^.total_len_Lo; + AHeader.identifier:= (Header^.identifier_Hi SHL 8) + Header^.identifier_Lo; + AHeader.Flags.RS:= false; + AHeader.Flags.DF:= (Header^.Flags AND $2) > 0; + AHeader.Flags.MF:= (Header^.Flags AND $1) > 0; + AHeader.Fragment_Off:= Header^.Fragment_Off; + AHeader.TTL:= Header^.TTL; + AHeader.Protocol:= Header^.Protocol; + AHeader.HDR_CHK:= (Header^.HDR_CHK_Hi SHL 8) + Header^.HDR_CHK_Lo; + for i:=0 to 3 do begin + AHeader.Src[i]:= Header^.Src[i]; + AHeader.Dst[i]:= Header^.Dst[i]; + end; + AHeader.Options:= Header^.Options; + + console.output('net.ipv4', 'Source: '); + writeIPv4Address(puint8(@AHeader.Src[0])); + console.output('net.ipv4', 'Dest: '); + writeIPv4Address(puint8(@AHeader.Dst[0])); + + buf:= puint8(p_data); + buf:= buf + AHeader.header_len; + len:= p_len - AHeader.header_len; + + if Protocols[AHeader.Protocol] <> nil then Protocols[AHeader.Protocol](void(buf), len); +end; + +procedure register; +var + i : integer; + +begin + if not Registered then begin + for i:=0 to 255 do begin + Protocols[i]:= nil; + end; + eth2.registerType($0800, @recv); + Registered:= true; + end; +end; + +procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback); +begin + register; + if Protocols[Protocol_ID] = nil then Protocols[Protocol_ID]:= recv_callback; +end; + +end. \ No newline at end of file diff --git a/src/driver/net/net.pas b/src/driver/net/net.pas index 7f7bd38a..1b4a5e84 100644 --- a/src/driver/net/net.pas +++ b/src/driver/net/net.pas @@ -3,7 +3,8 @@ unit net; interface uses - nettypes; + console, + nettypes, netutils; procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8); procedure registerNextLayer(RecvCallback : TRecvCallback); @@ -35,12 +36,13 @@ end; procedure send(p_data : void; p_len : uint16); begin - CBSend(p_data, p_len); + if CBSend <> nil then CBSend(p_data, p_len); end; procedure recv(p_data : void; p_len : uint16); begin - CBNext(p_data, p_len); + console.outputln('net', 'RECV.'); + if CBNext <> nil then CBNext(p_data, p_len); end; function getMAC : puint8; diff --git a/src/driver/net/nettypes.pas b/src/driver/net/nettypes.pas index a9549a67..faf20ee4 100644 --- a/src/driver/net/nettypes.pas +++ b/src/driver/net/nettypes.pas @@ -2,28 +2,64 @@ unit nettypes; interface -uses - console; - type TNetSendCallback = function(p_data : void; p_len : uint16) : sint32; TRecvCallback = procedure(p_data : void; p_len : uint16); -procedure writeMACAddress(mac : puint8); + PEthernetHeader = ^TEthernetHeader; + TEthernetHeader = bitpacked record + dst : array[0..5] of uint8; + src : array[0..5] of uint8; + EthTypeHi : uint8; + EthTypeLo : uint8; + end; + + PIPV4Header = ^TIPV4Header; + TIPV4Header = bitpacked record + version : ubit4; + header_len : ubit4; + ToS : uint8; + total_len_Hi : uint8; + total_len_Lo : uint8; + identifier_Hi : uint8; + identifier_Lo : uint8; + Flags : ubit3; + Fragment_Off : ubit13; + TTL : uint8; + Protocol : uint8; + HDR_CHK_Hi : uint8; + HDR_CHK_Lo : uint8; + Src : Array[0..3] of uint8; + Dst : Array[0..3] of uint8; + Options : ubit24; + Padding : uint8; + end; + + TTCPFlags = record + RS : Boolean; + DF : Boolean; + MF : Boolean; + end; + + TIPV4AbstractHeader = record + version : uint8; + header_len : uint8; + ToS : uint8; + total_len : uint16; + identifier : uint16; + Flags : TTCPFlags; + Fragment_Off : uint16; + TTL : uint8; + Protocol : uint8; + HDR_CHK : uint16; + Src : Array[0..3] of uint8; + Dst : Array[0..3] of uint8; + Options : uint32; + end; + +const + BROADCAST_MAC : Array[0..5] of uint8 = ($FF, $FF, $FF, $FF, $FF, $FF); implementation -procedure writeMACAddress(mac : puint8); -var - i : integer; - -begin - console.writehexpair(mac[0]); - for i:=1 to 5 do begin - console.writestring(':'); - console.writehexpair(mac[i]); - end; - console.writestringln(' '); -end; - end. \ No newline at end of file diff --git a/src/driver/net/netutils.pas b/src/driver/net/netutils.pas new file mode 100644 index 00000000..48f0f1f2 --- /dev/null +++ b/src/driver/net/netutils.pas @@ -0,0 +1,54 @@ +unit netutils; + +interface + +uses + nettypes, console; + +procedure writeMACAddress(mac : puint8); +procedure writeIPv4Address(ip : puint8); +function MACEqual(mac1 : puint8; mac2 : puint8) : boolean; + +implementation + +function MACEqual(mac1 : puint8; mac2 : puint8) : boolean; +var + i : uint8; + +begin + MACEqual:= true; + for i:=0 to 5 do begin + if mac1[i] <> mac2[i] then begin + MACEqual:= false; + exit; + end; + end; +end; + +procedure writeIPv4Address(ip : puint8); +var + i : integer; + +begin + console.writeint(ip[0]); + for i:=1 to 3 do begin + console.writestring('.'); + console.writeint(ip[i]); + end; + console.writestringln(' '); +end; + +procedure writeMACAddress(mac : puint8); +var + i : integer; + +begin + console.writehexpair(mac[0]); + for i:=1 to 5 do begin + console.writestring(':'); + console.writehexpair(mac[i]); + end; + console.writestringln(' '); +end; + +end. \ No newline at end of file diff --git a/src/driver/net/tcp.pas b/src/driver/net/tcp.pas new file mode 100644 index 00000000..90392c40 --- /dev/null +++ b/src/driver/net/tcp.pas @@ -0,0 +1,11 @@ +unit tcp; + +interface + +uses + nettypes, netutils, + ipv4; + +implementation + +end. \ No newline at end of file diff --git a/src/driver/net/udp.pas b/src/driver/net/udp.pas new file mode 100644 index 00000000..848138b5 --- /dev/null +++ b/src/driver/net/udp.pas @@ -0,0 +1,11 @@ +unit udp; + +interface + +uses + nettypes, netutils, + ipv4; + +implementation + +end. \ No newline at end of file diff --git a/src/driver/netdev/E1000.pas b/src/driver/netdev/E1000.pas index 89801dd6..d1186b43 100644 --- a/src/driver/netdev/E1000.pas +++ b/src/driver/netdev/E1000.pas @@ -14,7 +14,8 @@ uses PCI, terminal, net, - nettypes; + nettypes, + netutils; const INTEL_VEND = $8086; @@ -146,8 +147,10 @@ var mac : array[0..5] of uint8; rx_descs : array[0..E1000_NUM_RX_DESC-1] of PE1000_rx_desc; tx_descs : array[0..E1000_NUM_TX_DESC-1] of PE1000_tx_desc; + rx_buffs : array[0..E1000_NUM_RX_DESC-1] of puint8; rx_curr : uint16; tx_curr : uint16; + mem_aloc : boolean = false; procedure writeCommand(p_address : uint16; p_value : uint32); var @@ -269,7 +272,8 @@ begin descs:= PE1000_rx_desc(ptr); for i:=0 to E1000_NUM_RX_DESC do begin rx_descs[i]:= @descs[i];//PE1000_rx_desc(uint32(descs) + i*16); - rx_descs[i]^.address:= uint64(kalloc(8192 + 16)); + rx_buffs[i]:= puint8(kalloc(8192 + 16)); + rx_descs[i]^.address:= uint64(vtop(uint32(rx_buffs[i]))); rx_descs[i]^.status:= 0; end; @@ -349,15 +353,15 @@ var got_packet : boolean; buf : puint8; len : uint16; + i : uint16; begin while (rx_descs[rx_curr]^.status AND $1) > 0 do begin got_packet:= true; - buf:= puint8(rx_descs[rx_curr]^.address); + buf:= rx_buffs[rx_curr]; len:= rx_descs[rx_curr]^.length; //Inject Packet into Network Stack - kpalloc(uint32(buf)); net.recv(void(buf), len); rx_descs[rx_curr]^.status:= 0; @@ -384,6 +388,8 @@ var data : uint32; begin + console.outputln('E1000 Driver', 'FIRED.'); + status:= readCommand($C0); //console.output('E1000 Driver', 'Int Status: '); //console.writehexln(status); diff --git a/src/kernel.pas b/src/kernel.pas index 22ccdfa9..92dd4e53 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -37,7 +37,7 @@ uses E1000, AHCI_OLD, IDE, - storagemanagement; + ipv4; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; @@ -95,7 +95,6 @@ begin terminal.registerCommand('BSOD', @terminal_command_bsod, 'Force a Panic Screen.'); drivermanagement.init(); - storagemanagement.init(); console.init(); @@ -142,12 +141,14 @@ begin testdriver.init(); E1000.init(); //AHCI_OLD.init(); - IDE.init(); + //IDE.init(); //Nothing beyond here USB.init(); pci.init(); console.outputln('KERNEL', 'DRIVERS: INIT END.'); + ipv4.register(); + console.writestringln(''); console.setdefaultattribute(console.combinecolors(Green, Black)); console.writestringln('Asuro Booted Correctly!'); diff --git a/src/system.pas b/src/system.pas index 66159cbe..2ac03547 100644 --- a/src/system.pas +++ b/src/system.pas @@ -36,7 +36,7 @@ type sInt64 = longint; Float = Single; - + //Pointer Types PuByte = ^Byte; PuInt8 = PuByte; @@ -55,19 +55,35 @@ type Void = ^uInt32; //Alternate Types - UBit2 = 0..(1 shl 2) - 1; - UBit3 = 0..(1 shl 3) - 1; - UBit4 = 0..(1 shl 4) - 1; - UBit5 = 0..(1 shl 5) - 1; - UBit6 = 0..(1 shl 6) - 1; - UBit7 = 0..(1 shl 7) - 1; - UBit9 = 0..(1 shl 9) - 1; + UBit1 = 0..(1 shl 01) - 1; + UBit2 = 0..(1 shl 02) - 1; + UBit3 = 0..(1 shl 03) - 1; + UBit4 = 0..(1 shl 04) - 1; + UBit5 = 0..(1 shl 05) - 1; + UBit6 = 0..(1 shl 06) - 1; + UBit7 = 0..(1 shl 07) - 1; + UBit9 = 0..(1 shl 09) - 1; + UBit10 = 0..(1 shl 10) - 1; + UBit11 = 0..(1 shl 11) - 1; + UBit12 = 0..(1 shl 12) - 1; + UBit13 = 0..(1 shl 13) - 1; + UBit14 = 0..(1 shl 14) - 1; + UBit15 = 0..(1 shl 15) - 1; + UBit16 = 0..(1 shl 16) - 1; UBit17 = 0..(1 shl 17) - 1; + UBit18 = 0..(1 shl 18) - 1; + UBit19 = 0..(1 shl 19) - 1; UBit20 = 0..(1 shl 20) - 1; + UBit21 = 0..(1 shl 21) - 1; UBit22 = 0..(1 shl 22) - 1; + UBit23 = 0..(1 shl 23) - 1; + UBit24 = 0..(1 shl 24) - 1; UBit25 = 0..(1 shl 25) - 1; + UBit26 = 0..(1 shl 26) - 1; + UBit27 = 0..(1 shl 27) - 1; UBit28 = 0..(1 shl 28) - 1; UBit30 = 0..(1 shl 30) - 1; + UBit31 = 0..(1 shl 31) - 1; TBitMask = bitpacked record b0,b1,b2,b3,b4,b5,b6,b7 : Boolean; diff --git a/src/util.pas b/src/util.pas index b0448272..4338c2ad 100644 --- a/src/util.pas +++ b/src/util.pas @@ -36,6 +36,8 @@ function inl(port : uint16) : uint32; procedure memset(location : uint32; value : uint8; size : uint32); procedure memcpy(source : uint32; dest : uint32; size : uint32); +procedure printmemory(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean); + procedure halt_and_catch_fire(); procedure halt_and_dont_catch_fire(); procedure BSOD(fault : pchar; info : pchar); @@ -50,6 +52,32 @@ implementation uses console; +procedure printmemory(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean); +var + buf : puint8; + i : uint32; + +begin + buf:= puint8(source); + for i:=0 to length do begin + if offset_row and (i = 0) then begin + console.writehex(source + (i * col)); + console.writestring(': '); + end; + console.writehexpair(buf[i]); + if ((i+1) MOD col) = 0 then begin + console.writestringln(' '); + if offset_row then begin + console.writehex(source + (i * col)); + console.writestring(': '); + end; + end else begin + console.writestring(delim); + end; + end; + console.writestringln(' '); +end; + function hi(b : uint8) : uint8; [public, alias: 'util_hi']; begin hi:= (b AND $F0) SHR 4; diff --git a/src/vmemorymanager.pas b/src/vmemorymanager.pas index 3e70dfdc..90047320 100644 --- a/src/vmemorymanager.pas +++ b/src/vmemorymanager.pas @@ -94,9 +94,9 @@ begin console.outputln('VMM','INIT BEGIN.'); PageDirectory:= load_current_page_directory; KERNEL_PAGE_DIRECTORY:= PageDirectory; + map_page(KERNEL_PAGE_NUMBER + 0, 0); map_page(KERNEL_PAGE_NUMBER + 1, 1); map_page(KERNEL_PAGE_NUMBER + 2, 2); - map_page(KERNEL_PAGE_NUMBER + 3, 3); console.outputln('VMM','INIT END.'); end;