From 866d7b6a42c3d12a5932e3ab8ba8c7cf3477e461 Mon Sep 17 00:00:00 2001 From: Akshat Gupta <54988139+Intact01@users.noreply.github.com> Date: Sun, 11 Sep 2022 12:10:11 +0530 Subject: [PATCH 1/5] create file --- docs/vmm-reference-gdt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/vmm-reference-gdt diff --git a/docs/vmm-reference-gdt b/docs/vmm-reference-gdt new file mode 100644 index 0000000..dac46c4 --- /dev/null +++ b/docs/vmm-reference-gdt @@ -0,0 +1,4 @@ +This is breif discription of file [a relative link](../src/vm-vcpu-ref/src/x86_64/gdt.rs) + + +TODO From 567d1be3d569cf7cd212bef05c5c26c21d5bac28 Mon Sep 17 00:00:00 2001 From: Akshat Gupta <54988139+Intact01@users.noreply.github.com> Date: Sun, 11 Sep 2022 12:10:39 +0530 Subject: [PATCH 2/5] rename --- docs/{vmm-reference-gdt => vmm-reference-gdt.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{vmm-reference-gdt => vmm-reference-gdt.md} (100%) diff --git a/docs/vmm-reference-gdt b/docs/vmm-reference-gdt.md similarity index 100% rename from docs/vmm-reference-gdt rename to docs/vmm-reference-gdt.md From 96863c94e393c25689fd393574b80d1162bf008e Mon Sep 17 00:00:00 2001 From: Akshat Date: Sun, 11 Sep 2022 15:56:35 +0530 Subject: [PATCH 3/5] add description --- docs/seg_desc.png | Bin 0 -> 67653 bytes docs/vmm-reference-gdt.md | 177 +++++++++++++++++++++++++++++++++++++- 2 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 docs/seg_desc.png diff --git a/docs/seg_desc.png b/docs/seg_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ee6333d1bc92ee6de474ad67ac62ffb996a835 GIT binary patch literal 67653 zcmd?QWo%qAyDqxI)Ib|-+AuRG4Kq{2%ndU$HO$P^Fhj$P4Kp({r(vEu{f_p&Iy!&v zK7X#I(OAn%BYSMWejjkycR6unL|jAw0FWgmL=*u4iWmSOPT(QIPh63#pTJ)Tb`lzn z0D$u6-v=Uz2IUI?5CW1Sg34~0XY0lS7&_R%R$W_t{EUQaz|Z=UP)L`E_4T*qu&kwD zq3i305sK7}lv0#*HG8n!j$H)5@)RLy{$?LypG|Z;td;VzIGP3v!b1e23BeO7uckWV z0pLpD_uW8qtbdi*@A~OM|Jq0~QcZ~dy@dc%qycU~6B6?Ozy3<-Tn$e^Pf60Ze?1C3 zArg{k7+qi;FEhCLPmk`NdI~)LCHA&uL127qDTY+iF#Dk>)A{A%JZi7YR~v)Che5P|S+ZDC2Q~!!zvOat69&$e z@Z=YNW@m2L!DcM97`Tk0QCwG@+S$IX=%nm31Fq?y^hLpP2KRH>41N?0%3k8({ zzuku6+M7MGtN7%xrkzig`vt@9Tj6T zzU{U@RXYYh-?Nf3XVJfhOC}<>Yo4en?!gI)&2@0do~_FmgU&#tG!~v8m z^%wIKwdS9_pYkPIPPKvxeR7DLs~PX7)4s$Ve{j!;Ugy2tr_So6{OdlHF_!~kDU@A1 zRdB^klWOu-7PrXW+Y;^5?1uM!ow45UPdH7XUvsl^l|Rm+sGjL|b2$?bYU*ytHgv|* zH4-8O-MzBQL80=GkG^@>c-XF|QQY`?^-HU76lX1_s@THtBVFNJ*Ek=$Us`bQ6 z(wH37khse2(Y);Glx;^E1rAP-?T^lUm4lfv`^H_m>&w=AGA8V;grh$4} z?{6;;mzxA%?QS%t8R(Q5S+?(1-tYN@-;8|d6ijH+V#K){vpx2O4SZ%=!g!GnGPjjA z3)b!`^OoLIiJW6RZIhfs{>C7Z7ToBL*=}0&uG=PIZFjVERJ-|~ZDQAZK27|#4U;r*jVY6UG&wII@k>O`QR^dE!&@*@xikJ@fB z%$~KklDr-qMB$__C%BTmbFO@_;B_`S-k#g~eK&LFK8c-^KN&c3-EL-45(bj5l^C?H zKwTxSuO;fDA%u+C+^Vyt;>BZqM?%fYD8l0Al_lTLf z-4^Tm1DzdJKC-fCMDSW|`nOh>DprU?*SQQw(hduxNOM9Lw+_Rl% z8vAL2cp?M*IzC*5)AOS{%?go;qSxtmpKj42^Hnt0$TVs7nEGRI9%Tdo0>U1>*t$v- z4I>#fFCF+Y9Y1*F6qt4>@7+iuLuB8QlwzjFzvC-PyX8D z!bvdTxCq4)CHVYQmwuM0tXY_nO$qqbd((9M+*JTnRWjllf*}mWZXh27w;M0BZDjkE9>D;CT?#f#Q z`3lZ>viahK7b{o&56`r^<`hDHFYd>Qgl*1ntCCD3ZNb@YR@W7#T-+25Pym3Khx+K@ zuI@&wcFkSWT`)sFQeM2HTDB3PLihRjvsH3!??W<1y5x^KC7RZqKL94nO_83>raTnk z)%o9ioNKx|i*ZD}q|~n&zCWgS;7Um!)>mvUyeG+(6^SXhNwz0a`OrCRbl01Vkp`WK zGNr)zhe&mnTh0E@O6vlU#nvArkOJPCRi>*0B-BEN@?A>BSyJvcVNson?Fe#Bz3u6- z8SiPv;#1m%3Z0ZAY9)MPT5Zqa!yNWJBIMkr%}a@ad2CzcbMS=pnX2|0T$Fg<42NBVjgZJ0tjxzgNR& z+evSJr?3~=`eC?EWv5rJ;wqzY^6#|Bu2ec@adx=YQ-QF; z5?1r0v~WjR5cnOk><2+GAFTOB3xATsV>TEsksW&zd8ae-zpL1-;E7MpTNC)$-Sh^n z>d3!MHeVa7ER0NbGxEVQtfU^+J5PSK3`NRhvmM)jV=!&35)wq*AW*;2_BM`)_M(!J0`yh8V0x#5? z-exNC*oh&H-l*$e8A2_}I24kU3?YH<7U|+XrJaNZ(CVz_g;)Lxt7+yU@-Q3}^z6_-7aZAHiyDLkoE9-g)c|>Q%1&AN|+&s|z?sTO*5-#+n zvNSfcD@hcF!_Saenj4*1>YkXjZGS6A7ql&R>I}SlzfE(!Smy%yaL||0&9B`n^!b~s zj{n}Hs7$LQSX=xv+&4R1@%FLjn#?hY(A5+bkL~VYwrX&Y&a$}5X3E4=XK)#3D%Q(; z>L>so&Zf$a2LGZDFkc*3o3zeivfufGfd0ZIMU8v=dA;xKMUHy+F%iGXSuS&RruB1q zK`;Xamqvru-&(*Ac$m$2B*xqi&!DW!)>D49#`J*bPCVN)w+C72QzHu;;`6=C{jvO| z*q=d>VwU8U3W@uDHzE}yTIS~r)l zZ*rFk8=_2-sVbtFH!}FtkE%CY-jd#!A5xqk=xBV&8RJM}lQ+H)$b4G*D+xwYl#{#F zvb@ZENSgW2UgG@R?YgV-8dCaRr|!Oa!E&wjOS0I>#!c_F@3H&Hg};ME*~zu6pthK( ztXk{o8Z^XHv+J+cU_tKc`+-(0l1Xoj-VfCnqMu^i&C5zl*%E$)kCc{_TQn@A$xA4V z^bj>#49I2E7mb+kz3^R2Cp|h&d?$Tb&U5h?A&G&5<*wwk@29MU+j~c@%3tPHmFhXL z(+D&C?Xrf{X7a?3(({; zZz*m42jZMi{Wp-Qo?65R@Sn610OPn(I{~>}KXX;O?x|TWZ#M=ZxBaB z=Z1xhw>j$-&^g^55&R$E^gjmW9_54saXG^AT=Yk)kYe~q>tH_Bj*n+~6;GU4lB+Em z5Cu;8LV)oko5}4P=lN=u$+$YBXKETQ3-`tShRPeS&7l|%ZsBm*=@Oby$#fqpQZBQ? zvAl40(QLPVxWrH?j#hfPBmx~nZl~yG)Yj()=c)LLc@Kmu-LHHZCd@Av&rGlYuywXE zA!Vez?q~Q2C1bG7JIQnu0E}DQ7a`-H~69yX0Nb zDO43M*8w^F>!hAOnvjKZw!$nfE>|Yhof2EJ^f58C!$gw;Uh;BPKp4jO=$8&*SFP zbCdV#7}e>HtS>G!QIBpmxqL|3bk5c-+_p2X=5#kXX9(^YZ{Ox=Xk8*?osAxkZC@1o zkIS2DESPFeFiV?omGp3twJGmJ=xE^;S=g#`bNe{I^Q#!OB+?6^-)lUO58P~GV}ckY znmHC!^_<`L^H!|>VfudFDW$=ATT=?;Hd#IBBzaIur;dhAAtia9)!v5dTrVA*kRfx) z4nz3P;ffg*U5nON=rGjAgoUq|Qs@^qajoM~?47jPCjoj|X!99ZI{7%AFRPu(_RrMx z6`CI^JVZ|_2j)`5ps=NQ6>ebsU2%z(VQA?%K$tp80Zn>4^EUmgq+d5bE_*$KXLi-D z2`{>0eFfrI+GO4lsx8A~R1Kzl*Eav?=$J^;;ZJcZ-0N(B|OxnZ{JyGG4)@q``uio?na+mUNziV}y6^WO`=o`&D?jO1_pKT#M*9Vs zO3lxx{gAUvhp1k7T$X_o6Oygt8DSU&gT_+J(V7kh?Z}MB{$Cz=PI%Wg&dMseZu(9? zL`i0Nm_snKnbLoD@EVe+8{+kF%9fh!Y{Zslgz!5M&E#v9Q*&&nR_fs6LZ9gc6BZ}k za9nd36aLSo?D$8&W;ireCBsF{5Yus*Z!_wgG&qo^H7$dJA3W)F9#CSUGpAoY6-6B( z+q4)gF<*^ym5|dPl@ta-nh0iZ1Qc~Q=S22XOrJ}UlMo~`io*; zUU-;L)*5DHxlUj6emmZ9cc3o+&_+63Jh9$n8n<8tM`pX+IrLPMdES44=4~vkOhE*P z21gbFUN}%?qJbaMogg5E0lD?%woP!aNe~3 z!r|x_yi|U(kOdNhV#JY2POV5cD7Sg@TrNR0PK+eHnYd4S$L{OI2rbiWi+S37t!m}h zh3o^lnT#Hw$#Ha%;f>A#;56%`Wj$$4|P86JxkM!!(F ze7t_leokXi$(M*yt(l}yt$M9!a=8EsbLujJ3;O7gvDp)TJMpOQ^Bn$kh3`H9PP4tF>?9Ckm=NoF7=>l<19fSqePfq)Bmh{xFxIhUwO4 zOxtmw7K`Q!Xyv4a-;cA}zX(#iIMeNX8>?gB+&MYOHaZwP{h_&FywB`v|LQupNWbYz z!Y(hf+5y@LGO9>NB)OisYHG+XdHPwhXrwWX3av=&3ZoZlS(ckyRaLZ*|S3$5B8kOvp_fK z@Fso4yxvk0v{uv7p)x2Apx+pMHzw$TPO>TPt)5`3Rzx0$y$I#oHzk7v_8uRjjcgZn zH%o4dIjVHpT+UY-P8WqPf(DB~EmHHjy@4gOFD_O~HTEw(j+3+D7EKP4Fl1~h|H{+c zl(#AVb<)53yfTJy8BcnJAd!GE-#7Q$UNw7JWM^kK$rg5cK0kv-pcxh46iip-kWDE2Bx=fAxTi{I0s`0j@h-K!Bkro>YDG{ zK6X`LxJr{jLi^Ysz;D9WnVj(3o-wYxNPn;Q(UD+sEg*1|XxalIj_*BzHD7bY>dxJ;7uk{6NmD3P$)N! zi^wZI-af*NE?-Vk)b)@PRv|d{J@^sZOU?JauKAq2EJ0vog%N_rr}g-z(=x6)zrLGn?E-=0k(n z8}1El+j^wW0bqy&g#AUgr<;t1JA5`4=l4Tz&k&LDnQ=t%j%e1>m&%30oVf@;d56w{ zGhV@zU8KTs&*=0M9p;1)pBqBFPa8R20w1)NawB>s~oFpW0xgO*PwU|?A zC#qu29sOliNgfh_|1p^TVF~-1J&mI3$I7&;kbK(?hmY!#rQ(LJ#EyBzz}3^CT4Vw& zAfF-Ml&PxgS>Gf}p?kZp^U>)cPUlYD_+khCYO`A7rrTuyoQ?z;_|*_5`5;s1@pni! z-O+yIsE$hJd*M~P8gH;^9WEs?CAFb{JQg}oQg7X{_M8*R;$pd}$zmz*d)avy4-gtG z>X)a9_q031somt!j8;C=h31<{bk1+~TkgM*+vsK&EvIO5vH{*&h=o-Z8Lx()V=PoYC}?3^3~gDR@A!Bglr zd_OD}-Uo=^*L=gzSELIkb{KmXQU9*lON)elA%}2TTH&OT^Cjwb|Ls2U6CvMpBZ1Mp zFum5Zr1-Mi{`AuxUPTh|;^cV^+gITF;xet}LZ3$#(}bd^*8OLDg{^z0W<*fog7fTe zrDC}(K2N5dCxet4Yb0CcQ!5R+9Gv_~=;cx~j&-M)$?@m}>2RHx;e$JkX(VrY6 zm0S%CBfLDbzd$4McPC!@LE+(#zX;0*pn=Esj-02GEREm^JROj3 zLq0yz&01McSE#shr5BGg4}_$L*0qk<^)nI$EpiDc0By@#dXxy3I$g%^XXx$?IN_2P ziq{7_E#(%UYG4Wk67G3QKJ@`=rh!f@Qu z?C5>`D_SgEgz+B??lIl{!^6WS!@mVKC?1s|S#Q)}{x{PV4r?62qlY2;R)T;Rr#+2$ zub`Um!|E_aAX@s5{=h&U+2Wyc(FuL-J@>!d&Q$jUjjfEkU*Ajvlo!@JER!d`ZvQac z?>JVqDP=ffe|Dj#thwl}Zea;_;4uNvHr=?4v7o{?>TV~>~49(Vm|b5s5*w`uWW z-7*#Ug-Jv@f6>?_DdH7_Z?)gfS~*Gc=?-ro2{ZRm%{1K1J!|wumj^VgZ+-5wxV$d| zTEv&FgB_e^>Y}9y_d>QID&=JhC*G864K-gnizEspZ(l_Jpwi>2WKU}f_eEf`&`W5h z$pv<_=c6d=_S$J>!GR-v*YmXUqk|2xgyxcB-;;nC=d79^`B~k?CuS_Z4$p^+^>T3v zPdel~zVgkhGHe{8K<%$p3>Rz^28iBt`LX3`t|HYEKUbK6;Nb+{IUF5;|?~6X#CzvEVGL$F}Vogtt5H(CYn#mF2=fxwPd?5%a*CTu1dWZK-xY zQV@Bm>+{Kxrmg3_ean|4XQXXaMy9f`bXzUMf%D0jzyrypY|5PW8ssE*B?TIYqWm?Y@Bi?4@lDX#l(!q->_OLzVg3}hSUo|b_0?yI&}TvRZ0p}DFntY zYbIoYB{+HbM#V#J&w5f97v(73l+Epzv5}5$S{g+4D(t<6E1DJ%jDBR*lr%*)7usH_ zRg{|;wTMCd8v!Fv&qT250+<7vE1zyv+#5Ze^;rKXp0*w@Q5$^(aBJ~z8$Q=u4eZtF zq$`)xw~m(e-H^*18P?R5noFCSKFC1@quR}2y*E>pjo0*yub!>m*uP1U^bFU1obhh- zln{Vr6zD7I=%fSyrI`sugo{oY{V!g=HxJ?f@T@hQ(Uld1Z|saYouC8sqD>Abp>J1F2TG8n&t(~w6H?`(YiNh;B(5%sJ7*=M$zTFsN@cx zj`i*w>3FwhQ2v?l^~>9dvje_Fx#P_@j3HGn_#DROuS4S!#~$Z*W=OE#C$XE%nH&eE zCe+%=EbI?n$y&G0&cY~=p9f`X3g1rXKPZ!>ny?Yls#Nc{sd;rBB|95NUZ)a0M=R8c zT;4k#gNB^CBk}JKm}kcMbh?^SK{(QH?lY^WbOtm7neM)@xq&8Oj&T6n_=)^VmX#&w9e-XLIgnhxiO3; zA-E!=aL}lZiarNcP$3EZBUmf=UtRzkx$MY_TYjAvb>h58V!6L}^x#8r*stN^S22i} zD2w7$anGoc_2rpZj~CVC9z|(`*CA$sF}oc!mN$LSo=^FF?$%V#3wd93!*f$WLMQ*C zzaS1FwIVYK&IdnV#x>zsC;Npf2`1P8GV*-uj-#E1-&|~ZRH=lPKPtxB6Z#=abkqBx z*#-*_v+0Jyk-B^@FUFBZy;m+Yy_u~tb)t;QageM+=KIRO$)6V&+6EolV91D-PL!!8>&(2;ha&6=5lIpgdW5spouGj$?cwj#bLf$moX6hhKk<3+8oSM@XS0phU*~f zBz)vRg5_0GNBJGoAbtM30wUJIO8coTdN?9KboSm#4(I-+5+d;Ei7NNThpaU2+|9fQ zG3p0$-=rKZy>UVHsLIdNE?Bbh+-i5o4iF(cT#xh1sP(3BUibt7B>T6ObDi#K`IQxF ze8x6ul|?%CIy#6(Ss}wb5Z~~LOGf9Mv!eij?E|Pg&CT2SftW=xTCcR#BhkMm^*bKz*)TD&0)jxRqfa(kLG)Pr5s}4E_lbj&)$M_ZpJY?Q`fG zyng4l6g*K2j(V5954YJ6hT&Cxhixbz0*s=wFKaGyc`8Peu9Z^Npd};-;Nkc;Ud$f1 z{2eo_zF%{&c)5w)Lq9g642?$72gU}g9B~)@@xs(>Nv`K8T-Msy5 zZj9^8VfZ^DiodM{d^KapxJljeGSy}8Ys$sb+Ss2#MaWcIG`nke07zR@z3`QS${8$< zzel;pvHJ$*1x47R?h0`L!lS7cwl&U<8xm|k0fXMwDij^m_P4^1_7mrL=1QR8>{916)KTVw00_UQ`f%=1g+{2kfpB&Y z&Q0m@-vX12A)u7o+1O+NDDP|ND#QW0o4HNF^mDzoYL@vkx(hO@6ofS>9a zOPRFTW3z1BL_m>6U1vz*-}|XM1^^myBfBGm;&etwqil@B7Zd(F!tVU+h1H!q8jhB z#QY%iuJ;$$-<&R1?2jdwWm%bU7UjAnff)NML{4(X`so(og zyqwg9A8Zf&{CL!9Z{E}bdi29a%F^7CH*aVI(9#R|zZz3h6fVxJ_pB7GW_o&pL2B4( z-j( zyiJ~ozCi^UNvRDd86!BgAu@$4e`~!i$#_8*+OM+AN9b!(5)sJyirlq!GzR>}I-T_? zeKlYI;15n0g)n(GSl6^G)8vq_T@RBzPSO{=P4&VL6ZOD}+0isPo$8+?>`PlwvtGVa zdU9ei3cb9v1>HTr8hsFhhx1&j>MK;YIeA$wNrrs!S2~2E?Ai)Uh__m~28Wx<} zkR4wTU9P8|{QVG{sNiSNr$+0sUy2@$%21!rqoLsF+T$r-OWp%4I-S8Hie(w!7z8BG z{VMk5&AyXW6db%P>dI9`y)c#3r}y!Y5B|-;VM*DqlhdN@^-I_}GlB|>3lf!Q zOybHuucwQWFtnn=NJfR4p4wCV%I^*z_sIVIF`1E_yS<%Huc4+D61>H#oMxcs)&g>*o==gNq|QFBCQ-E$n@P<&qM@D0zlm#6nrC zNU1C}n%(hD-|C4)Cc%NWqZk;);A9i2o$slS)Lc4ae+JYA!Q>l(p0^Y_s{&I4VKk7qzEAm6SH*hhJa{l<=n;XokoCEokf>KVRI>gVRp{Vm)7H5P_~H7 zBF(Y%@dF-$xRK@{F0xGB$-f-?TOdlV1CxN@s%~yozCe<`pH+lLF8kotO6%e43=!eMRbonitV6GQj);CO8$*ZcCbcpr_=2UxIw5CGc=a|c2vI-5Ldf(BE&1Jq(V-qUD# zwKnGGFOz$wK$U5`H16&}PfO>UN1G8v>+2iq8}82+=z?mOn6Hn?BZ&AjKDSWQ?>B0+ zXJuaIULXTCmUjg`u*3z?_ge!#DN11G)RLhK63o|rlngq+TIg-=3k5$r4I{41lCiYC zLWZ!}JCR#ZNPC%O3n%Of6t36(3KhY?Q&8@p$%T?Zi z{@(o4-H5@?Pi6Mrw%;SB7qfEKR-_0zS9iu{Wh3#@L@czH4}T{EUHc|IZD${HAqE=m zZ>3=+oR@qS&>sm165rKhukSLt|NMGvS^5wh6cF)eAw&Ua{SR9*Wy7^Gn~5-Gdz0h? zD8xvo{P1q}rWjo)&2f@inlGj@w1~Fhl{s0omW9417(dZX$N>8~C2;Iw0>8K5{Mt0x z{R8u zWq@jQN4+Qn4x#b4ZY`+1%RxmU6l|hET%LcLPYce}n#px>9n{; zuKfFgS>WdxI*rSpZx1*|@W4-0SGgQS5E$z?8R(*9=zJe47Wkf+(`RzHcjK>m%sxfN zX|?@Z4U#YxtM%L~SaEeDz4-x521sp1f66WUPcqi`q~+eFHaMXR~MLEv_QI}L4RbYXVtWT--}&| zE{pq9(M3j1PhZCXBI5OkO-6j$uXE3(E~Qsi3Tq`T?>hX&C^((W<*KT-Ff^e%f=;XA zB0H2hc{X2f#PL;r0mE07eG^#?AQ0A`w;18HanfF;{7rR0C)SdB7y$G?1ueX6WS&#$ zZrrko_@&&v8-LIe>g&~RJJ!QDj%(jbvHkQI?!gXAJ?~+We5KncOnB(^Wxq2{ab~AK zg*k0Tw+BI-8-eP7muvrDfv7BpfwDp@ZlM0>{A#CB`n=imjM_U9Pny1VElX zK(0NSKFp-oJ2PUz0e*YM9C`&xWSdO;bi7|Pc6|`u)V`a4Oqt{l%b&Aub+yc=S6$rx zwGv`lXA!=qn`XMhbmAa{ayUEw*XADmvJL`X5>ab?aD2k(@#^NUGaiwUkm9|^yN7U- zYC=FfA`-D0Dod&hX|)rA;6WB!03M!q`{85pEZFMkC_iz^V&dHWAJ;4D3bxl@yvv+> zh+M8)^GShnqKwT$tO0^-gL%(>xUy^FlH8vBfpo(_exKvU>z!!>a$rl@Z1sIl#rFYX zG6qlL2&-9j%Gq0IFeG-0G5f7Edp6eHI@)*S_GP=yS)FlakR(!11oSO4U-Gup+q_X+ zm5~m`w>qGv?gmpk8IN;AuolI`?|T+ex94vYBjuD|*cmznev6e;ji)2x5h$&T&e|o( z2I(qB+2vIpSRm25-2``!iDwzV9Be&-*Nkod}=VsKOB*pSD)9Z2qRlpeS&c({e(y>XyDe!BmrW@!*X z4gfm`)|#PX$WYy^<-dC(f*XX;+MGk>EiF@!!;KhZT}n>P(8_2keu612U)$tOl}5i8 zr*-)C={9M4l;n`TAI7FRUssI}p6NzkS}dJ1@v=cNhN2~MA0;Lw;^GwE-)Sl;2yZy^ zxn#dq2kMPl279wThmo*|YZn zjZMq#ejs7+gWiEcWw2r*=gc8D(2cneH?BEHaPAUNYu3N=Jb&^hwP@U!+9^{60|tnWRPE|kaQ z;9I@zHj_9{63!Yo6*fN&2gzUtnFQT?>*eSq*VL+QcGx1*M!FFgEuEX_uJTF}*p3T= zkTYwt@L((H=h%(^cqgUSu>D9b7SRa_^ilceZK}`|+^6V_c@rzRleyi$!iIc1oaU6Y z-RYD(O+8h%_M{w<^1@D`T3PE>7S&w(O{AQIwq-onF0WsffkVB`B6~vgUuLMh14)$V z|MRLx#fcH)RkYB5q8rknlR_6Euu)86sS3O4nL?3kv*e^%wudA)OxVopcMc zlJasYc4P4~f{UXq&+UjQ%>v1}_hW8`wUy&0s!Wo4RSUoWEhC?J`fD#EVfWq1#WCvB z_&f%g4}-d$lk#A0lN;|rg(gpP{|y-l*F_ZUFQR=5-|F8fKX?u+HJP>f-+i+>n!G-} zuF~gfib!ZWZM`b!thChE*SY>ZW3rg<;Q-$%m~+jXo0N3#@)i?5OKL&K(viydd27~p z^n_X_Qz?Hq`~!{H^spqmg_@F%UJIF}@G_7s@*m zFLUKSt%ip9{AIA6LpJW zKOm-OJEcYGpz@^ebnK++XI;JvYh?|-N~kgmp<45KF(eh9G21Oo?m~v+;nv@6?LsFP z-PO>?Z}MY`v`$;qQjNv*aGMMhXL2{BW?v7EIyR%$(9JZ413~?7 zprw2cTcbrl`1aly^h3*kF_`nz@WT>(lET2z$w`wZBDozz&Fq6JE@AFw&s zvNSnAzFdFM{sfSo;aaiXP^LCrY+2|!8Mml(!PsLU4>vuxxm9{?{uv*gWqqlwE+33$ zo>)d3YOXyO%D$}8^@epd)cwGBUHM2EMK0ge{5;l5VtjsF05VwL>kD)G8~yk+VpA0{ zA-UY-tTe34WJ=NI_5(}D$@QV0Y<3WIX%nrjq!3JaI0v87_(fPnyM5)0Vo0#d2^x-$ zT&A(FIwDj7mlc0oWn0ywZQS9W;&tsf&g;+HTiS~l2t(G(;cYx5dhuyM^keR2`e$&~ z2Bt&HS|T!}UPHK#uLxgRzPV{)T@q?spJygMeN?Unn$NJSrR8ZW z$_e+|v>JPMa|*7v&)>dQ$)guO2Q7T#~fY}+%> zE&0JQsm;tsD)@j7nvYw5TxfkDO@AOr+{qgiE;c!8HuiYsY4>+giSfDi;NWum2OR-?+T@Q)XN;anIXO9-;r$7%oJS4# zF8AerXz6wvc7$=TwbdSId0agz~W*6or!!%X9;i~jv}gVfOu|4kAM>Lgd(QI`)KA}-M`Zl+t) zJx;UH!N$D009e10je0X7`29@i5%!*po0+e&eG(rrubl{c*s)y&TEQd8Ml)th%5)oJJn!g&C0R?OOsb+Iyv4`pHM=b_Dz{5!n`*MKY#HnIRS%_ zUXX?OxU05X*+&&W_}WkWz9W!8nE)Yq(idNrTiKLORpL(r!o|@%z8*KdTR+%~DYs=m z;+ReYmE0}T(HbYcF~__6$LIUo+e8oo6MS#L%s`wVL>vHAe6|1R=EEIuQKkJXQ$}d- zc}26{L-F+w4nUp&d;9`t>&8Yu6hG|y#D^`Tbpn>tArR>_k6Cgc{WDz|5+XF!aj?ay z7H8z-Nh=<0$t8qoP?bIc`dDJ3q@mJ^@+i>Ydt&25XbG~f80iRoqoH+UTjhQ|jF$Y( z+_Uy4^|@Fx?MLS%>l82Vlhi(SZnm1iz;2}7*kgM@%R^vwIzU!Uo9>L?cb@?pnMTc> zRE&(K#&GrH8{J}N0k0}8zCxiT>GCqC^1!)5Q8?4F(?>Fk33|z?Mu6)QS2lkQLs zi_ctAq-zg3bL+~3YnFX?+P{b{j}ua9v({W8{*@QVDvDu_!Wy-wdjwHX&hYzRQV z)cJw&Sr;2>u3n3}4gfIHsUoCS)rX*f&>@Zl1G|FRU0;hV!8@#Eyz ztUnZ{0pam3r8gww^LvDBY$&$brCtA$L29X-T>77{_%FX0b2@Ka2u?aHCq`hbTBBxC=-Q0$$!rb(oQN=N zjDF1iHjO>tDYNW5wP{?DN9#XU4GAz25=y+sivc)tO2A_!Jb=c z4?qa*r)3gECaO`WMx?mQr}9jE{osLy-gTyGE)COWN272-z+^5JuHu4M@u2*8^WYXZaA8* z0ZIl~g055A2zp{zziCMeiz$R=)F9m2y8!^^>dG}xA}n8wJlQ$k8Pk>>m^KZyz&({_ z0tBXV9W9$3Jr2d`0sr1WXC1s&d^fE!1l;(^i)QU9?hzR^TIv3OH z^SAu;8b&D@&zA9^X=VqA|V2q!%<&Ez? zI)?afnztJoZZqzrRI4!r1KiC&QEfKDDgIdnW+|N=7{Zg4(POZ{`zY@hTg2zb=kWQ3 zJYkUP_3msNgSZdD>o~v!(^N{5m6q9L&l9UMYet>VW@fY{@0sFETYjZEcS8DmSL}dk{vdO#GCx9-j>^3D_V%AY;~SN7)}Nw1 z>G96#;1shcA{D(jHzum0@}o}iH&*tox3~MFM{T%Y)cJBQN-Pf-CdPYy4GO+-(hQVE z4Bcz_7Ip1OQ3!{yTU$rrsUEJ%Ui{E5LpC|<;eFV*8gxtMBP3JI3Py>2-0@AsiMq)s zdvz#jC^e$dda>Sl(^1zJ{8%$r#PG$)%e|=7m>||xBJH3XQ*;b$f-;u8k5^~$0%6X(2Qr8F;&!)a%(g5 zJln41>-J6yJ9K^KOjEs7Yn(N~#i?GI@;i(7M`UhpYD8ND;#_Js3`U=!AGz;4?;8heY{J9Zj-rKBZk9f+v({D8DWdZ(rTKV22F>w3l(r);~rh=3pA z%iKi1hSEu-S- z+I8K=U4jM=!QCOah2ZXP!QI^*0t62pJa}-Yad+3op>cQH{eJ6Pd#}C6UgP{ZU2Z*FkGzNLBW8R zT{B-$bJE>AJp}gA0mC7E>MKUf7;$}5%8dy3Y)#}x0VO`<=pQ-IklEWW%+1-VcrlkLy z8}QQd0cj|tpB?xjz#)>iUelB7L8yTzt#i1Fh27|Z5M@4q?&seB&Tcw^uJL>;DY?Fu zi%I`HBNuP3!cJJML4D+`LQTRgS%Z`(WuheORFsnz&4XYME~}DZuZ7<)rmtODxK=b% zf>^VE3p72CWaticK3Z`q*JV3#D1%Y%bIUAc=^liAJV-G67vKOdV|cNy5i%ixOTQ3l zBayXegH22i>aLg9E0>tujbtP9wWN^f$z?oP+Boi?O(AdSOS;_7gU44Y4v&ef77zFP zFJ2~JBGVb8Dw}8jg45IDsK=VM&OJUoeGq=@mq;M{0z?Pk+!lOz>v-F>lLY&`BIV*k z7xC6i*BnaxXm(arg+Uv(EgPfVJfot5oFWf~J=IsZC#8?EA%~YN=nA{2- zVKpM#X^t%E1W0q zTaekml7^HDy4e4f((^~zDE*)IMDjV>zhnQ3>#@es`j70P|1VFo`EmsNwoV)UG*9>G zraCAWKXfV=9&)AQFt5s0A==MPZty$NV|;hgKa_at9QqyRoh;=4pa07Ldl#0AFERHc zDe(>X_CVljeUu&3#b<8@%|ivOW8QJATjM(0QD1HG`n?99hiS=+H^u7Y_9X`qr$0-p zVOI&P7&V|6<4^kW0j%yjpxH}3=Ksz|%L;yc=ImC~p2sl$w7)P?M08fj`IKS8G7t2) z%q7w9IB|89E}#jOI)Ans;wY&ZDW7yG?3eEoE|e957idw>Oi?pKyvAVtDoz}g;^ zFkG$K-wb=VOuwzHGDT*VI}sjZ86C+A{|z+jpCk6O;iMJXtmxUdZdxPNe$S9G$aQrn zt+WEwc;x1s-rOYH4eCEK>M-POY<%3PNiQ=#CRK=A2p?DHLle$j`eM4Q6x#Q|WYD(A z(lNb=<70P_0n--IW{G{f*enklMr|8M7gCFy( ztbLTQ_V@Q+D@!_Ox+coHPWM_v7hi(&$s&)I&vhgU&hl_?- z_^kNLzsvWedH>`|Jf${9I7@qbeX^!xXY=y-yu=o6dT;W zM~58Vp5?p<@%OEOQ(*Q}5og{`l|3oXP^rbaXp)D)q}0Vmz3X}`CE#hNzai#Ma5$3h z^`6xN!3V!OOtZ&|Z!loBLR3MJ1m4R5T_)H8F21AQD`>K^{mc72cErum;U=H=#4;Ef za1~pHOV#_1NXb34xX z1K92#-d0!8QBXJdV}4NxXKwXf9j|b<%E6%XW-X~~3-nZF*u1Crd0b0Q|7avWy|H9P zFLVkBm8$(`8WH+Dl$DTKaPHCST#QuEJDYNj%OQ_mTUmuoBF$V;sDS6}B67c9ts@8# zo6}}#f^nRb*-vK|lzV>i<<$wIhBhsxRjdavWaq&ZS!q9teDpU~R@NRbqTso$BkrUU zZA-Grja!Szv~9ZwW{JXxJn-SW+&4@UW(&3p*zRsrA1@C2Z=gV;gxZAqL0+$RQB^R4 zKH9~$cQ5?Oh6GIRX}U4~qhh%Ho}MipyPa9*M*M}Tb-cTGu5F|?FNOSHFz$(sm_9TN zEO+mC(*t0pX-@h0s!?~`Jnji+3_t4Sysc>Ta`w27c*qA2A1&6HE0;pt{#UnT z3uNBYD-;o9?Jyi%?B{OK+1VbW_6S={OQjE>m&ve2PPXF#`Fa}tG?y@?W@y5}*`4PF z^i1+UyE(3S8cq+`?S3L+dq?Be*Y~wCh+Vv3{ycWvq0iT5=TEcRyKZBNf2v6|c-;2- z8V3)cZRT#9?@Ea;Ty1IN&-4}8?_^ghdui79Bhh6-^M5%4ExdX}ST42160eCL&ifxI zG_Hb>j?dml%;=2DYYXC-ayzcPmCfpTbPw!wN!0%gm zJrd{Co}ZPyLM!;I$`XwZA7w<6vf8TX2~SEp_m1;o6jA4bGRRYDk)A5Yej|~KIa_c$HhdHQd<#dj3-T1)`SLSDym{WYB+Z`~R@ELQcj!;QGA`&S&ax2v+--6z6(QZUAR_+R zNu%Yw`8q3*zejD3k;{Y*`3S{*#Hl3XbEqtQEinji|oJ>aY**VUy ztrqzl_5)_S7aln}Nw!YpQ%C`?w@3*+Tc*gM!CoC_Lj!G&vZf{#9zf}LF(?abe=n&u zMDu%*{r-v$1Zse(Ggd@!_xz5JN+OqFr>s`QYU7sWKwIJ-UBw%)e&~Q{LcS^*-xdE> z5Xx41Fh||P(Z7YgIV;w6gdS ziGssyC@#9R+T(*5Fc@OPq#%wvndMxWo#J2vM?0%(=$g|C+<(EzkgXerUo zh_qB*Y@WKw%YUEWe%+`6*v!H*`1z6&;6D}T>G5VKs3<|xN>9R4(_o8;Nq0Kq6;*sf z%B9aoN}9a+DWJ-Qr^&*LD^fXvlX_G5dZ1c7z9u+g%r(SmXTdY%vj80*=j`e&Ad%0HgF+AQL4$f(1aPHL6?gl9CzHsECmWgd{d$ z69WRFk?0OblIm>n0KV77At!5CmY+-Yp6T=nKgXRQj%YNDgBp!UA&nqKvE|qZNv%w2Ln+CgQEM6kHLB>a(R<$24K&`|wUvI zrxu2Z5&nLOuVsgC7N~*W`>G}21Q4|vPU|n1vyd6-l(QHafs8*J03Aa_NyALTN%~QO zlaUQ+(-Ix{Vws(?l(r!iO;x03+QB$gqwRILH&byRZ@FBmZ&Zv5-xa;rVmUbiu7ABXr)2Gnwpae3( z1Bgi@Mh*hf`;#?p0z&vT?Af2Mh^U}L6;po7k>6`eO&J4 zy&?*)e_~H64#W9-@d6|E&aP#ix1!ut_pA0`6XUDVZY94}0uy;&%O)iPpldhaK?}Kz zZ>2UoM_ezG_4eB0pN1qFKr1E3p3AqYpGB5d2bPaii1L8I58r^3a5h{30N=GA7Mczr z8t*cqNKj1_sUBL)2*Ab;^1cV+yKB|Q_w)*FLM+>qiK2E z-;CUyuq#n807Pt1Un(>l0OwZ*k&33N>az9G5yYgF@>a?E75=0-%qjubkHtO{{j?sT za4OW-)}lH)%rj}Om|>cy$V~k$rreu8(x2t9;(>BX9f5XsPTA}VD}UrS0tO)PmGfrr z{)QV)FNrVYU6o#D1~Vl|u2-`unEmH5@Kle~^R&Hgxxs`wsP@-k>UtB&&9WJX`gpBR zO3?RE4-M_fw#ECQY%07xTOxIHhiMXd)Cv6B`K}IlqPQP(Eb&r@dnr z%nzAG{3S-I@NTibIzKo3U;qoaiP#xc?2n2w`P*eQ^}y^pv`?oggaY_DSmNCs-(PMr$vy%CxABiVelXc;01E;w z_LtHTJQU938Q=mFHGSSYQ+q%;cv8y?AgfPK`9shRz0g-;)C`4TED1O5kLvc$7kivXKJix`Daj8pjDmkHA(p7 z)UXep%GPpbGW)j;J2fBop0c8n#4rE=ZqmJ_v8Dm^w(av&gxoj~NnW|NRRkAA2LSY( zxE$a2(-C^!7YACLm@uGtOxmGN!T>~1`Xwwt8gn6NCt3qjJ!4|lHmt+T#WK>Tg4Qi{waq3AB4(MzzV&D zAre7a&y~DDzJ_y=q|i3(6`Q}FGi5Th#8s`!$sw0q4qves0!qkRSV=w0W_je;<`?Xz zdz3^gqHL=lA%aV(dr96;0fQ1M(aT*_BhOgGAFNN?jwn=(%|F7+h$Bkouc~*3Imtsm zbhdGqrO<0C^p354RWFOme=XFd+Z!&@&$9V6xIbibWL3`Kn%?QAhQjKCv4t)6k@{_c z(uOInFgUL?N&}k?DW>z80vRaNcG91k$Hz`g=O$=s3d3b(m40_-u>%*1`B~~ZdqrPV zPH(wuPD?h3!hsL0B$fWBT1bz?mUc8zgPWUUhP8>W*-YT##ym92zF-zF^FR{fl!!aC zxbKu|pT25=dOzr9UaBF0C~x6u?gxkh6Lc|w`I_fr@Hux6m?{p7NYZoY6l`d#v!#0h z8XzlLIc@t&#DyKu042WEoK$S<(vzLjHC*gb{JaHWiOm&pHDP(h zp@ng`CL3z4Z*SG@vwuH_e{%9?ke+gH)v;^BB0ViZ${qlgzY8gZPAT5)NT5q}K5wng z1JO#!VguiD1V)?5dd6&01NhuDs+34aFAgV{@D#44RUMj`PH?G|QghdVhv1z6OcI z)Ih?2M^3v5rEcU3Rha)y z-IKoPJ7`7iXwEUJ#zCVKMfcCOI@o(2x1H3@og}HL+#_bV-Y0*=*e}cMM&5&0pI$Q@!9Ee2Z`d0j{$sqbvtVeT_<~Mip}??so#Efgzm=( zkf}^JJ4)U=BJ^P%3VfR#;)L3QO2n9=cG<$HqQS3Kg|{@CJM&7_%ef>f$%uf47^E8-T`#)WPa!r~J!|dSzox{PuoA)h8`y}!y@+OJwXcMV4o+^u6Wb zW-!Jk&9;T?-LLMb8>jP2lg(Z&@LpKqu@ml{#e~I9=kK+%buXy=m4^H$u9x|9MiGMt zoY||5L17@~(|s@d@qOyvj)D^|?Q?omel9$pOH_IF$s4qlxq};VB-v#(mZBE3BN&^Q_9VLUj%hS};PK zhsB=A_NmwyIda)jR=FZbqc z45hb)U>ymVNK6MuGN4FeID?mMrjk=U5=R0R+B&@+XIvD^8oiI({I^nFqPP@)PfOq5 zjei6IOR_6N$_H=kG_f8~DFw8EuF?&?!abqabKcSam<*w+~BtPsj3(u3d#&g{EcT=U2lSkvcpoH zyLEPAc@92dGreuVfCIp?i+NOk`IwW-^n5jw$jkBmWFsMApY}3Yl^f8-QZ2yfYshiL7tt(6b@LQyHR?P#q+3CqsXOD$4#ciu= zPw%X-=4>0ty21CM`}I{9R<*5`7dDpq2J&;UA#FW6YLgnP=PB6 zEs8`s-gN$@pQd+i!W8^lBltHjIwaJV9`Nat+?Te;p^U&#!s9;$9YZt(z@jsR?H?z4 zS#qJ8`-=7*4?5bhdttdAcgLIcm!0{st3#sPCT~Qxt*sBm^M6D?ib_M}Qj4Ue;Nan1 z!~OSA(lfy2ekD7T=H2bLmbzxg%JVs5vfr1Qt)YzHlPO7`ne7Z+9!#jol`iI1C#sQT%%Q}=Gd;m3Li!e0 zu%T9(?v*Rej$?hYaCX^Qy7&lHca9`H11_S4KlF1AR*=#xT4MQ|Q_0c+<;wTKscgMU(m7-o#6aG?+*|#TrDfj4wuDi6u4nRu*x#5=%o`2*r}Xg4Ej? z#k!#6CS3EX<1*B2nm%MCa?at))1Fy1L%f?&=jtG4K_L+$K845+Sf9s0Mg>UB0VT7c znBh2KsEZ4s!zEUqpRQ|4it*&`i{OxaBzaev_y_UjS^U^kG*PID3y{QRUJ&T5N}16< zefJ`eY<=u&eDF!=;U>&F&@ScCA9d^(jRDS3MF`&=9kD)Xzz?DC$p;-&T?hXV@4Y-Q* zG}#3C=%?Slp@dOdrvLaAcb}AamAcG=;Q%7~$@q!aLtmY9N!2fAw5|T3PlUvhi&0LA zG=AYXRM#}Edy%xd_mO@As`+@!6{1bOk>*W#^g_ZOs(lE!` z;3B<2(w=6P@_Q=PA9vvtRS=_5E!{`-3zo|Aj-OxccsA+ypZ2lE7PAHZpUH7qORO7} zwxctwquU_tUW|r#?fISRd}tJnWzWyVE^_)6XIWA#6~QK+ObASm_0bcH{3)PYl6Uy! zPmIFqYg8yJ<-LZ3*LYk6wsc>qaUA+JX>d(%3s%T` ziORoysJlQLNOyFdF6b{dUrMS0V4NahFGaw0^>h(H12D1@bN8pl@pW#+Vgf891zKrB z7oFy8LpFBT8RuCqF4yjK3r{1{!)*bLYrj6MZ{?i7!IA^u5>E%4N4jHGF&+RSuox5B zLz{AUj^<9T9e!17x@$cA`{T2N@z5dIqQT)~g?tl0rHk0R=&Al;4VfDUlZ_U^UCOXN zb(9ZR7vz7^TeU}15Y(I;?HQzeT*(V2RE1z4jPG+*rshj!AG_)QCj*^FB6JF+(HDCkV^#Re~xhk-PYM|gv%HkP$I9H{|w)hMW&(o^@$<_6N13Q7=X zu{&}%q6F~MbqTka9h8zZh{3QVL%~dvuF(a@=oiv)BHX~ZGFLD+`K5lWSzWF915fUA9{Rs0DU03b*Soz!skL#LCAEc4&O z_HQi;uE3U8tKn`1EX6otX(jgMDWJ9~<<-&BHit5FSx_aNiNN=D#L==Otpv%tu&dD% z5OEd{1^`iAXQiIeVrRN5EMOIyRX@Cy;bhh2#3{kgqcpQqvn&7kAyp4xTsZl|IL0?W zv@E=JWX7Z-`8)jBv9{CesrGi6JcEqVHx&b@-(O0e?1G0634Y#8NLL(%M~9d#(7-1j zKUE`UCuE2ZmmR8&m58W_YGVbnGrT1ysn}T#rW_!xh)-n6{9<)DmddPD!_MYLe;pjp z=IN11C@cwPeU!r(=1|XcxlL4sn(IW)r>!2Y8WI&VkWL&Kf-xUT#AQs{(@dCpS$NsSH@ z_$1G@G>laL*xrzdT2=At3Lx@-kY!us7!f89=ed;cGT%sP={4xC{tatoLZnYg6rd*S zJ$Op>eM^U8;Lq)P2yC0mE>?_c#q?l^&M6a zx5{WFH|KwTUe(oc`R6wuQ6S@%-{hC%b5n#W^|<)7|v#s|IMP=Ltq=a)OK zp+XVyDY!x)FJ>ZmMet&wvI^bs zLxxLMDo{FOwi8GqY)9{?>(+1c=+eAiAVe$A058Q z(*!xf{y%RYCR|!2HBnL&l}@OT-Yloi@-nbKTPJr3-j?w zw>-hwrS!gBH$fi1>Ilg?f63jMZfuEh;yY0Ll={i&oP|rp3fV@0eLtoLFLEDKi8uEu z&|#75*}kN<=pgQJRf-0cUja0Knad)NyRp>vUT_4CXhL@{d#Ned8rJEz_h|%;{XMTn z%_=THII0wGKlj&E-7wjcw>JlLg$l+LQkBFK{~3V-Kx^ks3bFpyJh1MZ??eRw>0vD( zvrTsuU+BN;89bGEc}1nTf@PGBo-}VbRwAtTutz7I$0vU1N5gbI5-vdT4d_%hzwW4Bdg_>o$FXyJEguz0dg&KBk zsQOuk^wbPgHZy)drSF3Z&=5uxeH#&Z-wsASFn_KO(QqaQYHWtPHj_@zYEdzC zq@k;0DzzuvfU?NOV}ZE(fX(F?M^@Kg-#3!s03v&#;RCZ%?Tt#ec64H3j4;SB@}p83 zt~trm3VW)|6QTrK@z{D^pDdB!OT^E9AN%Ir#Nyp#bm<0O38-aj^8Se>s`52305^!` zI6%w0z$iM7q!qSUpSq#iTO@G&~xE`qEH$*9Mo z^(=0YAz==AwYgnY^--hZ?BXoekZSmyBEe{91(q|2vH!zo>mKK9EI0bqTXgcD>Jl4-6->&V9?2V@pt3$rla6~#E%hAz1K_oY7g=eTN>FCKvP z=d=6mPv$4)fR1NtIV5r=!X}^NY+pcN?WSKuejg6}N}7XtZi2X3E?I_KX_wW~*ZykZ zXSoS(gjZ^NS&FY1D8@3NuQb8=G8_cl0JxcKnl?J%I^T8vlu>*61kZ|#mtJ^gMgmfo zwdWO@%7F}lI8U|4+#uR<)gCJVkjq>F!k;)k+|qyj!lF*a1DP-lSH)B5t-DZEtNZXH z0UCq-B**{4WEx0iw$y(>05GY;NqN10)<*<9=1I24wa=MBvfOP1n$i8=Qa^{jVf#Ny zJp3v4u(1^#`#!x|ZLf%BUUinQ<|Ii@UU<^?iOa}}FH5#`M#{CsI99n>q~diUE8~)o zKtBKeSCkdE?(@m9R}>MkNPho}78FD;Y{_gL1;`d0w9H*C2gkSRXVkRJtb~6fq#qD; z7xL;{BJ?~mw~rA=vF@1tn{$Wp#2}R}zri*l(^i@u)|pQ!TfUw#r6*Pf+1&;4(bHel zhRexGU66x9Uz-hAuzLIhRfDa13O^b_kD?IogpP)u&gxu`lzeKro!~(n*j~xmp&jaD z3*4p6c}Ab9sTvh6n*@^|3CTDpfb8QUv<_MTg^`r#jk%^OQdMC_XF^m?adPvwm|=vS zFi3eH1>_pmiJ>Spvb4^h|0>gyfBqKPQ%#Y3KNWmO(HL)C4H}!%Qw(ERsF*E&Hf$9C z`30ClY00l&X{IcONQZRm#QxKCl=he?6I{-K-8E6S)zuTnTpp-6WE6qw(8!b zXj=81)O|vBGyR_c*PVU7$0GLpB2u+Q!{v%?y*WDvO_pW{ zr6wl4_V`2@_E$%bCNx~q1?5Hqgbz<#Y3$UwW|<-Bbr_D8Hf8z68!nIi^?Vy6FQW+u zgQ>aEIKG0}?bo{P?vvvioNmw%K+7bVia_lz81rxQ^cBAlqErX4w*S6u`pPEuTP=c= zmrEfHEtF0nz{6p(42`rZonBdJot`YDuj?6`{|vw0q2OT`9R4>-l954D^;fg&p96)w z)0(tyaVE7Tk?0NK7oWoCqdf792tmTiiTsb`O7tQ3WQ3*qb{M~xu8O%xw{Lngu{zC% zeufbA-U))Zo3jNFq_#?k%D8;PuMRfi?P1(L5Q%CR@ZLK)0R|@Tq_Oy{e8~VU$8d@R4 zfx_cmUW%BB(`fd)ti3;q{cHM8d;|9Fsy%UBCE`gUqt3fMd#_ZzO;yX@&vuQW%8OPp z2kxpL1RDbtE>?l3bJ;_4CUi`7qy@!s=QGK0sD1xBf%{BXyZA9WTssq{rUQrT$aYX= zU!CE}`rkthU+x14ft1$RDMp%IlhbP+@1kS@1Ay{h>G0Ey7xH{<2^_K{^dR9jwvNAQqCnby@i-CKCVNb0 zDY8EUUoO%jH0TH=h8BiBo~#|;U-?xj$*k9oE)mSOskhT8UTnQR-986zqZHk){>ZXc z-7}kaeQB^Ok6)9eO|e}VcgyQeBVfblCK=|sUx?Cc9#T3nZK4o9 zP+>o!USBVc_pqYZm~@4Vv-*~FZ$QlUHdges@_fZZrik*;T~aAz17G)J&b3uJ&!q!L zWiwL(GpgYkFv0=IuLU_8Za@KLU!i99@m*tq(MlZ-*~CE4*KqGUrKHEyi5GS&(LdVq z`N?9p)sCM85rmW3_Py{dxw>7-7eFC?hx-BEYGwSgvEpXrQObJ$MtZzJY(S7D1r^li zBfDU$CE)$y#d>@^mj}LkgUZ<%K+VO=TNv(N`1H1mo(Xi1G4R4~8?BT8n&m~42(+*9 zI~z`T{3UVTqezz2YVz%yx|No3pYYR339leo2{4zUo9fB`F$NtzRTKu-|Dwa(^I2}H z!kE8~)2I2yD#0h9vu@{R5DxGavw3F3zb7hdzhh1CNjG{ui)X;Ldk?ZbuCq_8ems}| z3`tgm5BlHKNS&RNO(#Lzz#wpvJ4v=?_+@LG51JLrInXln?IDDKOHm4o7CqO>fn(xc zA7zj{hk2oX!<#7L15`htOT>K&oWndS4z~`Eaayif>pyoAS$oCay18v=?^G#dK(b$s2%!#?L_F~~$+-);CQJTSlpvdfl4d{HI5C;IuK0-fu6pLvq+ z)lpU)BqXqy%vXC7!UzpbWzbP!khu7Tl%3VV`dPelfo|cZTC{AR9u!Ks z)INyqD6N|%Qq`NIX1upHrH+neo7!xj`G&pkAneD$SoHVo!4S6pJG-!t?nus=ZDk*n zRRcQA03*oh1e94gLths&5es8K`{6AgpP8NVv^c32oDxQ9>LI*I2ys5CtqJNDNNJf` zs4$Q|B(}K(R+e6R{It}VQ?W6!a_3K_eY&n{g8F!au{le5P*olc?^EXBeQ52PSu!mxjN3Ga*sk+~czgz2ujx|_ysgzJ>)8U$Bl7Xx8 z(0d!xu&^2&^0Tk&+a&hn&lOo=vpfBZP`4!IIH!u=T4mA>l&-+w;t)}%P{hgBH3SM-;8qndz7Ln=xA8}b+6R(D&%jelC)<2^wF{`Dj zkip!dd8cp@Bw?!G{eq)JtZhdW-*69_HQcWA#7dk$q@Qd9eFUbMk%`|;5LsE2GV~S& zZp(0=fAO8&n}ilaY!U7T)MwlKd-bz-EK1{^6c^9#?*B5M8r!q?QvR0ICtlgCKEhbF z5DA!O@Ja7^g$cCi{G8W5@oKPoz$N7t1GnA{W@^FMkp$_xi%!|YO2LZ5#V97h-b0Bw~^3Mhfb^> z{)SyS#U}<{Gq+VZi>f@C6vk0|l9hrTGrsGC>8p%8%kPA~BXi^%3ZkLk+zWH-XO>%g zaOYw=yU1}&ow}6N#?-R7V=w+Q9LYkLb5p@lGz`HU5<(#iqZK|ox1#-*z7h?(lbD4k zhZuTpnGy)E8$~F8>jZpvqq2hX*T029qn7$8GF*svEj?{XPBP_vZ`RJjRc) zvs{HuEF`4?fVl2CiC zVf=@oISdefS!-siQ;5I^gOBNCWLZnef_}jO{ua`l3g@!h?Vl;5mx~r#@wbVB>hL^W zlM7~5YmSLLL44>I%0A0Y7RpHxc>OC*}5eKC6 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 literal 0 HcmV?d00001 diff --git a/docs/vmm-reference-gdt.md b/docs/vmm-reference-gdt.md index dac46c4..17e8213 100644 --- a/docs/vmm-reference-gdt.md +++ b/docs/vmm-reference-gdt.md @@ -1,4 +1,177 @@ -This is breif discription of file [a relative link](../src/vm-vcpu-ref/src/x86_64/gdt.rs) +# [GDT](../src/vm-vcpu-ref/src/x86_64/gdt.rs) +This is breif description of file [gdt.rs](../src/vm-vcpu-ref/src/x86_64/gdt.rs) + +This module is used for building Global Descriptors Table (GDT) and writing it to Guest Memory. + +The module uses following crates- +- [`kvm-bindings`](https://github.com/rust-vmm/kvm-bindings): To use `kvm_segment` struct which is the datatype of all sregs registers (cs, ds, es, fs etc.) in `KvmVcpu` (see [file](../src/vm-vcpu/src/vcpu/mod.rs)) +- [`vm-memory`](https://github.com/rust-vmm/vm-memory): used when writing GDT to Guest Memory + +

+Let's now start understanding the different parts of the file- +## `SegmentDescriptor` +```rs +pub struct SegmentDescriptor(pub u64); +``` +SegmentDescriptor is the class to create GDT entries and export them as `kvm_segment`. + +The segment has following structure (from Section "3.4.5 Segment Descriptors" of the [Intel Manual](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf)) +![Segment Descriptor](seg_desc.png) +

+ +Now let's look at the methods of the class- +### `from` +```rs +pub fn from(flags: u16, base: u32, limit: u32) -> Self +``` +This method creates segment descriptor from the arguments `base`, `limit` and `flags`. The descriptions of these and strcutrure of the 64 bits are the same as given in the above figure. +

+ +### Segment Descriptor Fields Extraction Methods +```rs +fn base(&self) -> u64 +fn limit(&self) -> u32 +fn g(&self) -> u8 +fn db(&self) -> u8 +fn l(&self) -> u8 +fn avl(&self) -> u8 +fn p(&self) -> u8 +fn dpl(&self) -> u8 +fn s(&self) -> u8 +fn segment_type(&self) -> u8 +``` +All the fields are explianed in the figure above. These methods extract the values of these fields from the 64 bits stored in the class. +

+ +### `create_kvm_segment` +```rs +fn create_kvm_segment(&self, table_index: usize) -> kvm_segment { + kvm_segment { + base: self.base(), + limit: self.limit(), + // The multiplication is safe because the table_index can be maximum + // `MAX_GDT_SIZE`. The conversion is safe because the result fits in u16. + selector: (table_index * 8) as u16, + type_: self.segment_type(), + present: self.p(), + dpl: self.dpl(), + db: self.db(), + s: self.s(), + l: self.l(), + g: self.g(), + avl: self.avl(), + padding: 0, + unusable: match self.p() { + 0 => 1, + _ => 0, + }, + } +} +``` +This method creates a `kvm_segment` from `SegmentDescriptor` object. + +All the fields are the same as the segment descriptor except for `selector` and `unusable`. + +- `selector` stores the 16 bit segment selector value. First 13 bits are index of the entry in GDT table and last 3 bits are flags which are set to 0 here. +- If the entry is not present then it is `unusable`. +

+ +## `Gdt` +```rs +pub struct Gdt(Vec); +``` +`Gdt` is a wrapper for creating and managing operations on the Global Descriptor Table (GDT). + +This class has methods `new`, `try_push`, `create_kvm_segment_for` and `write_to_mem`. +

+ +### `new` +```rs +pub fn new() -> Gdt +``` +This just creates empty GDT. +

+ +### `try_push` +```rs +pub fn try_push(&mut self, entry: SegmentDescriptor) -> Result<()> { + if self.0.len() >= MAX_GDT_SIZE { + return Err(Error::TooManyEntries); + } + self.0.push(entry); + Ok(()) +} +``` +This method tries to push an entry (`SegmentDescriptor` object) to the GDT and is successful if the size of GDT is less than `MAX_GDT_SIZE`. +

+ +### `create_kvm_segment_for` +```rs +pub fn create_kvm_segment_for(&self, index: usize) -> Option +``` +This method creates and returns `kvm_segmet` for the GDT entry at given index. +

+ +### `write_to_mem` +```rs +pub fn write_to_mem(&self, mem: &Memory) -> Result<()> { + let boot_gdt_addr = GuestAddress(BOOT_GDT_OFFSET); + for (index, entry) in self.0.iter().enumerate() { + // The multiplication below cannot fail because we can have maximum 8192 entries in + // the gdt table, and 8192 * 4 (size_of::) fits in usize + let addr = mem + .checked_offset(boot_gdt_addr, index * mem::size_of::()) + .ok_or(GuestMemoryError::InvalidGuestAddress(boot_gdt_addr))?; + mem.write_obj(*entry, addr)?; + } + Ok(()) +} +``` +This method writes the GDT into the Guest Memory with GDT base at address `BOOT_GDT_OFFSET` which is a constant that equals `0x500`. +

+ +### Default GDT +```rs +fn default() -> Self { + Gdt(vec![ + SegmentDescriptor::from(0, 0, 0), // NULL + SegmentDescriptor::from(0xa09b, 0, 0xfffff), // CODE + SegmentDescriptor::from(0xc093, 0, 0xfffff), // DATA + SegmentDescriptor::from(0x808b, 0, 0xfffff), // TSS + ]) +} +``` +- `Gdt` provides a default implementation ("Flat Memory Model") that can be used for setting up a vCPU for booting. +- The default implementation contains all 4 segment descriptors corresponding to null, code, data, and TSS. +- The default can beextended by using `try_push`. +

+ +## IDT +This file also provides a method `write_idt_value` to write val in the IDT Offse which is constant with value `0x520`. +

+ +

+ +### Uses in the codebase +This file has been used in [this file](../src/vm-vcpu/src/vcpu/mod.rs) in `configure_sregs` method of class `KvmCpu`. The modules are used for the following (in the specified order). +```rs +let gdt_table = Gdt::default(); +``` +- Create Default GDT +```rs +let code_seg = gdt_table.create_kvm_segment_for(1).unwrap(); +let data_seg = gdt_table.create_kvm_segment_for(2).unwrap(); +let tss_seg = gdt_table.create_kvm_segment_for(3).unwrap(); +``` +- Convert default segment descriptors for code, data and tss to `kvm_segment` (to be stored in `sregs`) +```rs +gdt_table.write_to_mem(guest_memory).map_err(Error::Gdt)?; +``` +- Write GDT Table into Guest Memory +```rs +write_idt_value(0, guest_memory).map_err(Error::Gdt)?; +``` +- Write IDT Offset value (default 0) + -TODO From 409f84553a0122db2293683c4cbe37c690c0c966 Mon Sep 17 00:00:00 2001 From: Akshat Date: Sun, 11 Sep 2022 16:09:48 +0530 Subject: [PATCH 4/5] some changes --- docs/vmm-reference-gdt.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/vmm-reference-gdt.md b/docs/vmm-reference-gdt.md index 17e8213..1e1d17c 100644 --- a/docs/vmm-reference-gdt.md +++ b/docs/vmm-reference-gdt.md @@ -16,7 +16,7 @@ pub struct SegmentDescriptor(pub u64); ``` SegmentDescriptor is the class to create GDT entries and export them as `kvm_segment`. -The segment has following structure (from Section "3.4.5 Segment Descriptors" of the [Intel Manual](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf)) +The segment descriptor has following structure (from Section "3.4.5 Segment Descriptors" of the [Intel Manual](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf)) ![Segment Descriptor](seg_desc.png)

@@ -73,7 +73,9 @@ This method creates a `kvm_segment` from `SegmentDescriptor` object. All the fields are the same as the segment descriptor except for `selector` and `unusable`. -- `selector` stores the 16 bit segment selector value. First 13 bits are index of the entry in GDT table and last 3 bits are flags which are set to 0 here. +- `selector` stores the 16 bit segment selector value. First 13 bits are index of the entry in GDT table and last 3 bits are flags (TI and RPL) which are set to 0 here. + - TI specifies which descriptor table to use. It's set if LDT (Local Descriptor Table) is used. + - RPL is requested Privilege Level of the selector. - If the entry is not present then it is `unusable`.

@@ -103,7 +105,7 @@ pub fn try_push(&mut self, entry: SegmentDescriptor) -> Result<()> { Ok(()) } ``` -This method tries to push an entry (`SegmentDescriptor` object) to the GDT and is successful if the size of GDT is less than `MAX_GDT_SIZE`. +This method tries to push an entry (`SegmentDescriptor` object) to the GDT and is successful if the size of GDT is less than `MAX_GDT_SIZE` (set to 213).

### `create_kvm_segment_for` @@ -128,7 +130,7 @@ pub fn write_to_mem(&self, mem: &Memory) -> Result<()> { Ok(()) } ``` -This method writes the GDT into the Guest Memory with GDT base at address `BOOT_GDT_OFFSET` which is a constant that equals `0x500`. +This method writes the GDT into the Guest Memory with GDT base at address `BOOT_GDT_OFFSET` (equals `0x500`).

### Default GDT @@ -148,7 +150,7 @@ fn default() -> Self {

## IDT -This file also provides a method `write_idt_value` to write val in the IDT Offse which is constant with value `0x520`. +This file also provides a method `write_idt_value` to write val in the IDT Offset (equals `0x520`).



From 476f5a298d8a8f3d8b71bfc19832405040ee6f0f Mon Sep 17 00:00:00 2001 From: Akshat Date: Sun, 11 Sep 2022 16:19:06 +0530 Subject: [PATCH 5/5] change links to absolute --- docs/vmm-reference-gdt.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/vmm-reference-gdt.md b/docs/vmm-reference-gdt.md index 1e1d17c..e756e23 100644 --- a/docs/vmm-reference-gdt.md +++ b/docs/vmm-reference-gdt.md @@ -1,11 +1,11 @@ -# [GDT](../src/vm-vcpu-ref/src/x86_64/gdt.rs) +# [GDT](https://github.com/codenet/vmm-reference/blob/main/src/vm-vcpu-ref/src/x86_64/gdt.rs) -This is breif description of file [gdt.rs](../src/vm-vcpu-ref/src/x86_64/gdt.rs) +This is breif description of file [gdt.rs](https://github.com/codenet/vmm-reference/blob/main/src/vm-vcpu-ref/src/x86_64/gdt.rs) This module is used for building Global Descriptors Table (GDT) and writing it to Guest Memory. The module uses following crates- -- [`kvm-bindings`](https://github.com/rust-vmm/kvm-bindings): To use `kvm_segment` struct which is the datatype of all sregs registers (cs, ds, es, fs etc.) in `KvmVcpu` (see [file](../src/vm-vcpu/src/vcpu/mod.rs)) +- [`kvm-bindings`](https://github.com/rust-vmm/kvm-bindings): To use `kvm_segment` struct which is the datatype of all sregs registers (cs, ds, es, fs etc.) in `KvmVcpu` (see [file](https://github.com/codenet/vmm-reference/blob/main/src/vm-vcpu/src/vcpu/mod.rs)) - [`vm-memory`](https://github.com/rust-vmm/vm-memory): used when writing GDT to Guest Memory

@@ -156,7 +156,7 @@ This file also provides a method `write_idt_value` to write val in the IDT Offse

### Uses in the codebase -This file has been used in [this file](../src/vm-vcpu/src/vcpu/mod.rs) in `configure_sregs` method of class `KvmCpu`. The modules are used for the following (in the specified order). +This file has been used in [this file](https://github.com/codenet/vmm-reference/blob/main/src/vm-vcpu/src/vcpu/mod.rs) in `configure_sregs` method of class `KvmCpu`. The modules are used for the following (in the specified order). ```rs let gdt_table = Gdt::default(); ```