From 69777bdcab284335651a8002e2896f3862fa423d Mon Sep 17 00:00:00 2001 From: Lunaixsky Date: Sun, 18 Feb 2024 17:15:39 +0000 Subject: [PATCH] A Total Overhaul on the Lunaix's Virtual Memory Model (#26) * * Introducing a new declaritive pte manipulation toolset. Prior to this patch, the original page table API is a simple, straightforward, and yet much verbose design. Which can be seen through with following characteristics: 1. The `vmm_set_mapping` is the only way provided to set pte in the page table. It require explicitly specifying the physical, virtual and pte attributes, as was by-design to provide a comprehensiveness. However, we found that it always accompanied with cumbersome address calculations and nasty pte bit-masking just for setting these argment right, especially when doing non-trivial mapping. 2. The existing design assume a strict 2-level paging and fixed 4K page size, tightly coupled with x86's 32-bit paging. It makes it impossible to extend beyond these assumption, for example, adding huge page or supporting any non-x86 mmu. 3. Interfacing to page table manipulation is not centralised, there is a vast amount of eccentric and yet odd API dangling in the kboot area. In light of these limitations, we have redesign the entire virtual memory interface. By realising the pointer to pte has already encodes enough information to complete any pte read/write of any level, and the pointer arithematics will automatically result the valid pointer to the desired pte, allowing use to remove the bloat of invoking the vmm_set_mapping. Architectural-dependent information related to PTE are abstracted away from the generic kernel code base, giving a pure declaritive PTE construction and page table manipulation. * Refactoring done on making kboot using the new api. * Refactoring done on pfault handler. * * Correct ptep address deduction to take account of pte size, which previously result an unaligned ptw write * Correct the use of memset and tlb invalidation when zeroing an newly allocated pagetable. Deduce the next-level ptep and use it accordingly * Simplyfy the pre-boot stuff (boot.S) moves the setting of CRx into a more readable form. * Allocate a new stack reside in higher half mem for boostraping stage allow us to free the bootctx safely before getting into lunad * Adjust the bootctx helpers to work with the new vmm api. * (LunaDBG) update the mm lookup to detect the huge-page mapping correctly * * Dynamically allocate page table when ptep trigger page fault for pointing to a pte that do not have containing page table. Which previously we always assume that table is allocated before pte is written into. This on-demand allocation greatly remove the overhead as we need to go through all n-level just to ensure the hierarchy. * Page fault handling procedure is refactored, we put all the important information such as faulting pte and eip into a dedicated struct fault_context. * State out the definition we have invented for making things clear. * Rewrite vmap function with the new ptep feature, the reduction in LoC and complexity is significant. * * Use huge page to perform fast and memory-efficient identity mapping on physical address space (first 3GiB). Doing that enable us to eliminate the need of selective mapping on bootloader's mem_map. * Correct the address calculation in __alloc_contig_ptes * Change the behavior of previously pagetable_alloc, to offload most pte setting to it's caller, makes it more portable. We also renamed it to 'vmm_alloc_page' * Perform some formattings to make things more easy to read. * * Rewrite the vms duplication and deletion. Using the latest vmm refactoring, the implementation is much clean and intuitive than before, althought the LoC is slightly longer. The rewrited version is named to `vmscpy` and `vmsfree` as it remove the assumption of source vms to be VMS_SELF * Add `pmm_free_one` to allow user free the pmm page based on the attribute, which is intented to solve the recent discovered leakage in physical page resource, where the old pmm_free_page lack the feature to free the PP_FGLOCKED page which is allocated to page table, thus resulting pages that couldn't be freed by any means. * Rename some functions for better clarity. * * Rewrite the vmm_lookupat with new pte interface * Adjust the memory layout such that the guest vms mount point is shifted just before the vms self mounting point. This is remove effort to locate it and skip it during vmscpy * Add empty thread obj as place-holder, to prevent write to undefined location when context save/store happened before threaded environment is initialized * * Fix more issues related to recent refactoring 1. introduce pte_mkhuge to mark pte as a leaf which previously confuse the use of PS bit that has another interpretation on last level pte 2. fix the address increamention at vmap 3. invalidate the tlb cache whenever we dynamically allocated a page. * (LunaDBG) rewrite the vm probing, employing the latest pte interfacing and make it much more efficient by actually doing page-walk rather than scanning linearly * * Fix an issue where the boostrap stack is too small that the overflow corrupt adjacent kernel structure * Add assertion in pmm to enforce better consistency and invariants * Page fault handler how aware of ptep fault and assign suitable permission for level creation and page pre-allocation * Ensure the mapping on dest_mnt are properly invalidated in TLB cache after we setup the vms to be copied to. * (LunaDBG) Fix the ptep calculation at specified level when querying an individual pte * * Rework the vms mount, they are now have more unified interface and remove the burden of passing vm_mnt on each function call. It also allow us to track any dangling mount points * Fix a issue that dup_kernel_stack use stack top as start address to perform copying. Which cause the subsequent exec address to be corrupted * Fix ptep_step_out failed on non-VMS_SELF mount point * Change the way that assertion failure reporting, now they just report it directly without going into another sys-trap, thus preserve the stack around failing point to ease our debugging experience. * * ensure the tail pte checking is peformed regardless the pte value when doing page table walking (e.g., vmsfree and vmscpy). Which previously is a bug * the self-mount point is located incorrectly and thus cause wrong one being freed (vmsfree) * ensure we unref the physical page only when the corresponding pte is present (thus the pa is meaningful) * add a flag in fault_context to indicate the mem-access privilege level * address a issue that stack start ptep calculation is offseted by 1, causing a destoryed thread accidentially free adjacent one's kernel stack * * Purge the old page.h * * Refactor the fault.c to remove un-needed thing from arch-dependent side. * (LunaDBG) add utilities to interpret pte value and manipulate the ptep * * Add generic definition for arch-dependent pagetable --- docs/img/lunaix-os-mem.png | Bin 104532 -> 378802 bytes .../arch/generic/includes/sys/mm/pagetable.h | 318 +++++++++++ lunaix-os/arch/i386/boot/archinit.h | 14 + lunaix-os/arch/i386/boot/boot.S | 58 +- lunaix-os/arch/i386/boot/init32.c | 17 + lunaix-os/arch/i386/boot/kpt_setup.c | 156 +++--- lunaix-os/arch/i386/boot/prologue.S | 12 + lunaix-os/arch/i386/exceptions/i386_isrm.c | 2 +- lunaix-os/arch/i386/exceptions/interrupt.S | 10 +- lunaix-os/arch/i386/exceptions/interrupts.c | 5 +- lunaix-os/arch/i386/includes/sys/crx.h | 52 ++ lunaix-os/arch/i386/includes/sys/interrupts.h | 6 +- lunaix-os/arch/i386/includes/sys/mm/memory.h | 27 + lunaix-os/arch/i386/includes/sys/mm/mempart.h | 34 +- lunaix-os/arch/i386/includes/sys/mm/mm_defs.h | 28 +- .../arch/i386/includes/sys/mm/pagetable.h | 315 +++++++++++ lunaix-os/arch/i386/mm/fault.c | 24 + lunaix-os/arch/i386/mm/pfault.c | 170 ------ lunaix-os/arch/i386/mm/vmutils.c | 23 + lunaix-os/arch/i386/pcontext.c | 10 +- lunaix-os/hal/char/devnull.c | 4 +- lunaix-os/hal/char/devzero.c | 6 +- lunaix-os/hal/char/lxconsole.c | 4 +- lunaix-os/hal/rng/rngx86.c | 6 +- lunaix-os/includes/lunaix/compiler.h | 36 +- lunaix-os/includes/lunaix/mm/fault.h | 49 ++ lunaix-os/includes/lunaix/mm/mm.h | 29 + lunaix-os/includes/lunaix/mm/page.h | 110 ---- lunaix-os/includes/lunaix/mm/pagetable.h | 507 ++++++++++++++++++ lunaix-os/includes/lunaix/mm/pmm.h | 37 +- lunaix-os/includes/lunaix/mm/procvm.h | 68 ++- lunaix-os/includes/lunaix/mm/region.h | 29 +- lunaix-os/includes/lunaix/mm/vmm.h | 164 +++--- lunaix-os/includes/lunaix/process.h | 20 +- lunaix-os/includes/lunaix/spike.h | 5 +- lunaix-os/includes/lunaix/syslog.h | 3 +- lunaix-os/kernel/block/block.c | 6 +- lunaix-os/kernel/boot_helper.c | 51 +- lunaix-os/kernel/debug/trace.c | 19 +- lunaix-os/kernel/device/input.c | 4 +- lunaix-os/kernel/exe/elf32/ldelf32.c | 13 +- lunaix-os/kernel/exe/exec.c | 2 +- lunaix-os/kernel/fs/pcache.c | 11 +- lunaix-os/kernel/fs/vfs.c | 3 +- lunaix-os/kernel/kinit.c | 26 +- lunaix-os/kernel/lunad.c | 6 - lunaix-os/kernel/mm/cake.c | 4 +- lunaix-os/kernel/mm/dmm.c | 2 +- lunaix-os/kernel/mm/fault.c | 312 +++++++++++ lunaix-os/kernel/mm/mmap.c | 86 ++- lunaix-os/kernel/mm/mmio.c | 18 +- lunaix-os/kernel/mm/page.c | 1 - lunaix-os/kernel/mm/pmm.c | 43 +- lunaix-os/kernel/mm/procvm.c | 300 ++++++++--- lunaix-os/kernel/mm/region.c | 11 +- lunaix-os/kernel/mm/vmap.c | 157 ++---- lunaix-os/kernel/mm/vmm.c | 251 +++------ lunaix-os/kernel/process/fork.c | 53 +- lunaix-os/kernel/process/process.c | 28 +- lunaix-os/kernel/process/sched.c | 28 +- lunaix-os/kernel/process/signal.c | 2 - lunaix-os/kernel/process/thread.c | 92 ++-- lunaix-os/kernel/spike.c | 28 +- lunaix-os/link/linker.ld | 3 +- lunaix-os/makeinc/qemu.mkinc | 3 +- lunaix-os/makeinc/toolchain.mkinc | 3 +- lunaix-os/scripts/gdb/lunadbg/__init__.py | 3 + .../scripts/gdb/lunadbg/arch/x86/__init__.py | 6 +- lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py | 18 +- lunaix-os/scripts/gdb/lunadbg/commands.py | 26 +- lunaix-os/scripts/gdb/lunadbg/mem.py | 12 +- lunaix-os/scripts/gdb/lunadbg/pte_utils.py | 98 ++++ lunaix-os/scripts/gdb/lunadbg/sched_dump.py | 10 +- .../scripts/gdb/lunadbg/structs/pagetable.py | 230 ++++++-- lunaix-os/scripts/gdb/lunadbg/syslog.py | 2 +- lunaix-os/scripts/templates/i386/config.json | 16 +- 76 files changed, 3002 insertions(+), 1343 deletions(-) create mode 100644 lunaix-os/arch/generic/includes/sys/mm/pagetable.h create mode 100644 lunaix-os/arch/i386/boot/archinit.h create mode 100644 lunaix-os/arch/i386/boot/init32.c create mode 100644 lunaix-os/arch/i386/includes/sys/crx.h create mode 100644 lunaix-os/arch/i386/includes/sys/mm/memory.h create mode 100644 lunaix-os/arch/i386/includes/sys/mm/pagetable.h create mode 100644 lunaix-os/arch/i386/mm/fault.c delete mode 100644 lunaix-os/arch/i386/mm/pfault.c create mode 100644 lunaix-os/arch/i386/mm/vmutils.c create mode 100644 lunaix-os/includes/lunaix/mm/fault.h delete mode 100644 lunaix-os/includes/lunaix/mm/page.h create mode 100644 lunaix-os/includes/lunaix/mm/pagetable.h create mode 100644 lunaix-os/kernel/mm/fault.c delete mode 100644 lunaix-os/kernel/mm/page.c create mode 100644 lunaix-os/scripts/gdb/lunadbg/pte_utils.py diff --git a/docs/img/lunaix-os-mem.png b/docs/img/lunaix-os-mem.png index bb241bef7a1ce7900e50c8175b8d13d89fe59ac1..519ea3483024affcdc222d71e59fc73880d66481 100644 GIT binary patch literal 378802 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 ?4$U|&VL3_#)~;J2E^FKoF8#cXpJ8EfT4!iYXa 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 }GtR*}6=^x-l|Z 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 GgbO9M#=#qIENubD*%9qC@0e-pfaiM_oNdl72 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⑓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%0AEAfmDkj7^G@dx%(2qU(M&byKH<7g2;{KohO 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 z zaKRX#_u%v2wlQ<)&rR+ivjl~ z_AT5AT4fY!2PZ&~gw;TPpLJ$7Mh|2v3F-`h3_v)xGR0$RVixBPR?c|Bz<#;kZ?tLO z*u+k|rVJzcW2dG!A|4;r&E*qGGyjb1%w_9sG}#od^XH6~-Sf*L!!Z z#Y{b9@b0Bf76 zfjYv;Mwc>MxrcoAO9es1KsUKBEk`zw6#ni*JB`2V3=hWIe-0v1vvrimMtn zb65l(7-8e^XQ6IWV?A&RiH!IcXt0nJ_Uv-X!tPo9?4-Nt0{m1B&2~wdo9*#+9W|-Q zizp1{M_M)piQX&zj>wC8!nEl2fNzYRcX>P98%L0__bi6RVZ+9xkb0XeM(Hw)iv0$I zna}pr;Ju0oQk;%OGx+7&z9JnpC}iwl-^8-Kp1rWN^cR>20iVP9L>Xq^f2){)k?_re zm$qW6Pc9tNoI(6lT?|%fS1CFG8x$kV;pD)R57W2FY;y6g9F;pK!XhoH9ne+wDE^i0Bd}Wtiy3C-23s-T)}&t+Dnwa8E@aEVvu(bc9jd_H;7Z&q z@W^vP_?8#EFIRsg3`ta-1DZ(El(&u8C=jaR?S4zN+?`;%rZcyA8_)#*??ytjUyB6l=#j z-KDQQXBTq_(o-YfJf!0E#Yo5rXFTZTVN%w~`mt=C?K3jIpCDP=M=Bb}iOskz0$J8lx>bPR%NmW19 zjFu7D$ujSU)X;!2LW%cKpmM92?;o%w*YM=5QVbWmyevcPAU{+@oDGCG@J+*T%2%x~ zHaVD?nwomUU=$fh5lWcQLqbuexZ~*T{rn<@N?qV>_2mzD1S_D)@Pf!&qtzUAGdmM( zaXDEnfhT7_9_Vx@hyrwvgz|AyY`j1AS;(SkCrxOylIne1^{m9k@UZukv_0+3>HVCS?Ac@fA_%H01jODP726GolaRW&tm+imHY(+4eDTpFgE9&SH9HsT_ujU z^{8H6=KolKK*+rOA+Q_}>l%!X_x3yH+zq)y{pN0Fh&Bq{jLZ+ms^2>7b4ol7@7*EE zaPo%y5V`GrVcaHx=pm{Ws+Xw7t!>O%ID9S6KD@p%0D3AN$%L?OE0?GOB)z%7*V(&!r< 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

-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 z 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 literal 104532 zcmeFZWl)?=6E=!l@Zh#+2u|=|i!KDW#Wf+g1`W12BzSOlcXtm23BfJsh7cSUclb8X z^W>FNr|Q)Cc}~5*p!S}fo#~$GzWVC!`-7T_91a!*76JkS&MSEt4Fm*aAOZqP1_m1Z zlR~c-QSd*AE*f%D2vy&xb`TI~5njniYIz#(ub?L|>bw_tD3;pF%4!iYbBS#zPt-1_ zid7>aL5fpKB1pP^5TH#r-5Bp<40=KG&>w*OjPlJV94Y$eW&u2()C?=N+snsZDn)0q z`D}HH@h*v#dcRXW*QBDhZZ0q1dvL%j&T75v(kU-5cj*m6BFaHPeJ+8BrRER+*Z&JD zUnn5vk~>}QpHKdN_#815;79PUVZT2N_=svt5hy zH2q(9NPlOQ7QH*f(=d~XGdhd}^`aU*V_2`25_YD#m-EBJaj5Eddm2p;{7ZO37bBP6 z4`V_8@ALfEK^?(|`CP@tWz8zJ!B9F^qb-Hl~^@7B|*M^AYsgq;Z zA5$^@A`&6+!Dc%R^UE;(n*p;$>y|24M6|aqM9Vq zTT(xB-*0&f!WA}cR6BM69(TgnbHRz6J@Kota8~`;udcb}5TF+tF1`JEzcc%gH$$(i z?vxYa9Z0_NhjnF@oa%EVo#`6U@(mc9N3XMy3~6@A0FLE)NnCKgbq$o>?q$g5sHZ^t>GQW?MX?^H=APuI~i@+WK~MJae`5ylV>& z!C0eNdy?1Kgc5NiBSLFcFfDSlLr!HI;(Y)V( z#igqWAVZ#EPLD`<*vVs42=kpYqvN`QXL9PxNc5(QSCb*~L)LSzt=w+S@X!G7#SotI zlcQ^Q7#T68E9X>OHm6-!=pyr8CUPUy1Vxz1==+;fW&}u2FsJkhx&XeissHD7tV8|9 zcZcEwF8k>^sE`A6#%_vdnE-l^jn!l(+=v+PI^|W7BL|rFzVze8*1V*P+X?yA#%=!d zi}MV`(#=TOEWYRI6HY1mrDBj%X!NerQ^F7K?9(@$Ewoh{oukurMXQQ?2ugAYh9 zBz`11+0jL9^)m^4di_sv_Kz580)#V~&fLO_RZ0v17}`)PqcHAu+$M=Y-=w4NFQ!Pew3+MW&``$7V*WQs&u`;1684 zMhm&X*bR$WTb|u%a3_WlbUV26c-W#Kt%|jN_%;l;l&E+Q&8`t`+uSLxrk-k6D4fR4 z1|Lnk$k$4dO8qE?LqC+*)}W@~5MeH(mLz8F9)qT3&(c3WCBtTQv8qTKj{}r*p(GRN z)?ZyP-6`*8ACf2}ylHzH^`A@2k=Q|UA@oD)BGYE~Bc|^iu+dKsrfejU8zrWXm7cp6 za^pzQW%-lADS~4vqemM3M2%otUJ$RPJ&zzh#RwCf9KsS9f@$Faj5ngFA*H@r0jV zs~u5tZJ0K>aZ3K|FmSe;bSOPZ@EQ*)^4|_w1N9f<9g6R)Zr2qdIP|;w)OOTN9v4vv zKarg)@^Du^4DYPR5+$})Q$8InGVQHD7seQNNh||{*eks~Ub3{oCqSMPhU(22w8r4% z4IG`>jrA^e8n3s48Y&cs+q(8&ObfkYC%kHo@17an7rE5X>xTeEVYFSx_hF{Y!g0H+ z>Q0r;&R`~CYVNxUUodwb8-5hK=AL&b?$S4U8epL7qo38HU(c|_C}k#V%kH z+%E%OVgl>9#zzK6)v5J9CS-oDZF|Oulp83bd`Ttc#)Il2w9qmnL|)({ZZ*p>!HBZM zEd3dV5D|%lhzeyi4UKc-DLZSVLKO2??Yb7Ga$Jr8iX6Q5**D4Rsh9JR2n%JM50e*0 z&S(9AQ>`ER>zu!ZT|Wx2;*95ayFfs;sKO{>5*n|QA*o<5jg;h2M*D0pr9i2<{5I#h z+$=bq0Bfe7&!^u$;nn-3$g6_yabssa+zhSnR(!p4E#FPUJpaO3|GH@P%-qaSxuTRx zhb}Ds$wYYr%#0FSDF}CkK2ts)PvY3{GicM1B#|Fk+l#&bB1q)uc>&;KyFmL*khytMYm=tW{uZnbPVEY zxmXmDqIO?EtkV&$O#rB=7?K6bjuL<{ldDhp*GExUPEQI_09k`6HD5p8{5OOhnwA}L zuuw4izxDR_{rKsgG?N{6v%pf*2DhM|D)sm$7sx1cJ%QKM$ruIelxm=VGm%g0#Xa<&ZGH`x493b_+$;NuE0 z@TTSyBuz2DS9_z0^R3g5+MRkWbPICRje(}!Piilf_lEbAJy!{Jz?m8Y(rht3zMVf^ zz8b~45KpH{685mr)b<4L4Dq|H2F*jw5sUV!h^rp6g7#*_{Erd|s{x|ZOGx@PXrR+; zZj$U$5Q&-Py8D6D#lo~iA7%Q{$at-7XwGe((j~|p z@Pha6^iy)lYcxCMzbrw=3kYhcuW%kq1YTLi_AmrU(}>TE(4?*=34W)CSdL}^ds(mE zaO~!OURw(N6*XG>c-(HPg|24c@?xr!#f{^oO&NpGeV!(_+FR43jcU_%8Ng2h_LWv* zu}p*Yn=<^WwP3ZD_bpnDD9m~~KSx5#Ljj>_NP>O{6gH6!bnyprb>1Qs0n)MP9mlvU zCWS@wo1|f}7cDz9h$#x$r(#cJdtm)`!svr1qqEYNFsN`1E)aL?%EhU2xl8xSVeI6J z1kRb77=E}Uo}k1NuFzlA8r?Hag^XQPC#O5#op_yFhE;@)wXIV9gi0OGEx%ga&T^@l z&s37YhUFc}V(FhfVC3Ao1Td%jzbVXl1tnyDGOy4-HV7?ho3$1FW8t221?b@b>u4-W zW*RDP^;TR%%C4U6ITs|jc|6CmbUIZlK0=8!H>twPAor&}@;5o9GeybS0*8!lQDR9+ zLj;M;m553B3hFVJE%+bAP4{(K0h2G#)1!JJc$&)qh(G!o0 zeI@%KaOP$|AaNqpuwWx&E6{WFq`ZeQHc_>gHvVAT3t6JQ??4vECb2?c;MEzC7}}$x_JZe#e5;A zgCaS1ZT^;0gDonDoKqJ$LG|?_&%hXX&u*qZED{CBfowP4+Ia$Bj>K!)%W9Dk$w+SY zhDvizr3Z|P5z6{yvuGT3mjCB+O(LkngIUeMHY-4W%-Y8FOC9g7FJZ>dTsfqu zyG*5(QIl%Ey4#+s&xGP#ik!dl5<`)H?}5_oWkg9A!j458(#|l=KWz!<<4Z-cZ-0fN6-` zjpmQ9w2^7E6QuV3BnIN=-c;Du;mv)A3%Kp)vS>N4Jh<2XiF;Gt{}$4uDMJ!R8-C}9 ze4)APJDAaETJ~TX4tEs3#sh8iJiC+y_nq!RJ3)N`Lf^3U8ygvr-=y%Mewv}@a0vl{ zi659Blio&#k@TZ^W^8vG>TDCT*kn+GErUJU`e}%qV<7AFT-_@fYV^e`f`-eE3M`@_ z$HJg8` zKO>sY>El7I`*j4#a*fGaUy%y2OYXab9|JD` zT*i8K?hUweYv!MIka=?eqB`;-_#&K5>CiV7daAC|sDIxoXc+ZPSFElrIGJ|p1Map_ z82-CLJ6CH>(}KXXg!&|YaYENnqz{HB#-k%M{3~GyRP1ws-0Sok!tx{fG~~X4@!mC4 z4TgyV^C7@=f3C&oZ>u`+@TJ^4G2~ZVs0%cP9h{w9zMJ&KI(m;jGm7CSu=T@^r|&Z} zm5(&$8kzDJ9Y_UB5mifOSE-xX{yg0skq=~woPp{dW%`cv=|8@&c$)$48J4e*N(i@~ zNLP!1Q30K0Za;B1En7 zIL@E`k?}T060q&hl_}GMk)$Qs)5OsjI+S2b)_N`|EvH=+GK?IXIk?;N`g1(<45<7> zV%BnCvaCH;EMSH=Nz@#1=nNoJ_J)_|J@JAeL%3CcE4NgX&HbdBkfzyS<7`564tprg zMyyjp?WeMm0J?~RP2LJ24YBH;C;;n?{~%1092maQq|uceV6zQYM0gJm#% z%?=b0b!e5w#}TnOaKHPQUY0ZmA#xb^BlgMYUC%Eoe&s7WAELkU447)6R@weyPbFlo zg+<55w4z_3_wYN;*21(Cp}j1mE0mK?^W`O%qh(%)MLaVHzSl#RuC4+kvEQ<*I-xi~jV&frnej#vmYs9t8la6|5 zX`*P2GyP;@uUu5XRDaK^n~EGZs}DbeA47NDV5p?|v;M5{Vy;78*;;pGga_lj3co4~ zF=pt#JK^#zj>@6(FQz}&aZ{m@n7zq%29>`{TtSPC{ed>;?-lzLk9lQ`AGmqyqW0jC z2YUWiW(Ki9)VmeH6QTt2PUG^Y36G*7e&yP?>q+i#DK1o6l{bA^K-9G8nM5Hwl|L3T zdj!%KBH90zS%U}6D#y_IIq{YDtjNWT6XFIvlbTd%=(qO9REbdnAB-k8(XhGVCiQB2 zLr`sJFcK@s-+AGcs0-8liEa|YdLqLBELJr|oBE8?)DwJ*VP7;{F5Q$_nOeiqrM4>^ zB)*esnaR#gTz$o_b7$3Q6HX7Fc0oa8@u<9>%@TS_-CtM@zP2Sz6QylaslrNEvRAyM z-;T&D_7I%t1b32P&Ez{Ty2-<_=1ZFgx;^*(pX#nuUigbj-Cn~b`cd)+q02M?!a7&# z9XpK>nr@}{xcMBa-eSen&<9tS!Qxuzt zW%ASdkCWLVfbgK*InD>`=jy~dr6#7p64KC+mX zcCNeP!%tW$U=_R0!-u1s_aW%eDwE>6)?9Okev$krDQpI7ccLu*uDatx;x+egYQHPR$4vlyuI57IMj;kF;DRprx z1*7B?ju!ox)x_aXAXDPNAO&VKeJNlLq__U$leG--3kc1%EvO{YSoFK%Ll)=F^GnZA zX=GS!M76MZ7g0;@XK}hWZaW_8Ph%fY`|D=;CgaYx+WZ)@q`knLHJ-T5DG(jKA?oxHLEh_;u32i1HX&CR%$d(ZI&BanCee=dwqHToTkns@6_-7VVEz-? za6A5%Ndd9Oq`liTSl-fm&@SQa)gMgle4&7OX!?y30K}nxd{rFE90+;o_n;JxuJg zLnIAqo6qtj&ix;y(|-!%gl50LU0g?3m6QN^MQ-Z!SP6A9xYLI-{PA6p7)}-d>B;6R{gC~aRjKbGDPDO9D-E@qh2@o$NO#m z<^8a**iC#`=mUiLU&mAGIb&f{ZQHnLDhirXJ~L#|u`e{!*W*7QvjoMBxI!hCp4QMS z;zv|cXJsWd*4x-mObn@TqDSFMNduk-$bt&Yg_qQx*Vg%3RTv@j>PE;2i?ZyBr3%AT>-cJ?Px2%kVZ*v zg0vtMxJM%2*uF#Kek-tW3s6f(juHM!>r>o`>7`tSwK+kDid%t<_e<(2-XE$?l;JmU zFqeAJpV6)iSd095(fxvxc=#*}|dLZ|L**VYqNx?`O}l?bff9)x`wRV^$_L6 z-SWz&4R9cr<-b!c1)gr*KK!0v)H*yPz*51@m&Qm}#=KZ$9D!m3#`tu*ZRJZ?#E)?G z+NLc#eJ3=FI%O{Tt#MyW#bT_O9>pBaT6@{o*+%B(=C6!+`F_-A1D07n$%cv~9RRO_ zt3-2~0s?>a**t;4gdJ7=8Wr&Tl(|tNR$ePhxOCWZImOe2dlQY7R@tqCC1}~MNr+^} z6%KY5on}qJ%t;J!L-vlGjWUjSD9TU@C zT225_r|)ymv3m1Ss11RxTPEu`=QPJG-Rh3GuJ<7-Na>V)&JPpNMXb|vKI$QSG&C5u z;w;yDex^qKb$Yd8Zu=)dWsQ#i-i}97Dr%6uwPfKS@uDrE6S9dbBz7xzn=W~^nPsa@ zyz26(u6qj+EcNC*u<#`L6YZa}aI--zJJ5#V&Moe3NmPXl`!Z5DP@siVzNk!ZduJ`? zzA~oFsQ_0Q6naWThG}j-ML-SS&z6LZ?kfUQt~AoJ(myqLzHxB1{LJ^|)k;`qz{<6P1B6P?k!Ml5 z==BJOE9Y@&*mn4PY8pQ*^TL9*Iy_uSq#o}P@!|vN zv-8$~C*m1wWZcqW(~VCSS3F{jyBQdO#T~}rI5r{141gcI&c6S@XqPO4lxY~RhVn({ zi!mn$NTwa6YP(k`?E4;r+7pgC_Dh3%J0QIV3SAvaRX2qI)j4pbmX<-@1}h;^8#+K5 zUaC$>Y+8pL4oV}yoHt$jbp&mgo`?1~--~5EZtz}R$3Q;X2}G!!?^x;jvFI zV2cNzpC8G!IXYJTtV!rl@%U8+e%11+R4tl+!zA(=1IUvHWeb8a8^y|CH(=(tE6k)cy@cd z%A{1x_9M+}uJrOILxiE3zFcW3*d(*rtMC!Pz=`ZTXpNU_Z>z%>0sg=rk^Gx>8R@aM zSKnGnw>eaHQRXErMj_FwWZH9g6)i|`LMJ3SJ`kN*pqzkBC||CW`Fv3{^`AsVKpjEK zJWNwb5@f@d8pzZum6$33y&QliWTM*^N{1-?s2aT|iWeuO___Ps$^sJ-_q9VXZH$l) zB}D3?ag2&Ude#j%`_hW1g&3%Bw#6REIJ?Zn9Bzxpb2=+=xWq3-54-jps9r*)D~{PS zgdRi*kMm)Qy(lYTu6G#AR|MNGSKNG#P&rn+O)jMDu(<3`edDHa5$bD&n4k~lM@35kKFSWE5ZIM4o07zr#+t$s^&`W(<@BY#kw7eXU!ZURJSeYR-p6<1C>fK zB(4-p1S%Nz4K5%s>&DEkN3QnXz|n1V=g5NmLS2T8 zYjQJ`$2OVkFOhr}foqa_(c1XF$orG6K+%%XDY2hY>B6kf;qVeyF^s|Xy*Z;K7UfV; z{M5XARkzWKzXeLpZC@)rN*$+VB>roUgFxSH^_Js~F}nyiZQ9VDRKfCdUX?PDW>4UB z^@Vd>9vWe&VLu*+8Zump;R5BaF>Hu<9-WMItCtbmZ9QsLKWp{J80sp>q$_gL@ZT$6 zbl2jFiXMiC62)zbPLKdHcawvp0-@%lO0mtH+h1W}iH z`L;3NwfL!Q)bfFd*&iMbrET;LX|?cHOhUBE0K;0OXy3DBwToKEHhN*aUfOrg`8!wDsYP=9e6FOb{#x*5*Cqt1lm}Pq9 zWPVvFDXr_7_gW-t8m%m{if>RIjd-1NW0!&eX6C*bJ3O8BHd*M((A4rNlP?}i}N zCJ!WMgA^0S{IA12ucMkomu=e0P6Xzlg8elaUt#Azsa~2q4AXd0sPkey!OhDJ4ZLE^ zuKpGj`Vi2+?FhjQ-Jj--LGK^mhP`R-ETH+UNTD999$DmK%IBaF@chxq8;_oCGxAGG znt-NJm28@6RTr+;?36m*+>T|JhU-o0Dy?Q6mZBUfn`bQKNWTH|mo)@SOxI|FF}3U0 z{_R@dM`w-6DhpztQDY;a6=l%9aMRY;FDabN46^23?q?L~gr?_d ziLlIvsvY7MvMm=Lu16GyqkujgejNQ4f-X%*s_urSJ07OhGSFUuy+hd(hiAs3D9IDX zSyKOGi+h$a6J)RAYBZnf1sn$42i{ zoYlEv&Ip_4#DnLCm+xHpK_4mp&S>|u_Gfll`(ia>YYp(mRNa*!jf45wm&g*>>{2)2 zL-ZK;6w{$1kD{-DBh+#rF@zGBG}+MnDg=Pp)rE1E^kfF)S>ict z3kRu=VY2u_Th(ZakSz+@&CYre2&%HcW#&E|D&@C_QS|_OjbvxLo?&clOi?{FvG%=r zr|%{-zAWU&HoADeJLR-Y?aZR)TIJq=h%cW5X3Od0{ts;TRVqwvwwBa?`mS0*_pcv}0uQgF3j)J(K zQzqPK!Q$=%ksesD#_-uif&#uJ$0oc+->6_qOFvBQhHV(UcZ24gT1VcIDRK=*iTdRCfOZYn#eEnX-9$QY&R`sFPJp;+@F=b&SDp*r`cn)O`}BDPY+9?GfWytQJT6W8K$V`tMoMwzrMyKOSZHT| zEn@YGP9`wQs%$B|#X6_ni{K_|d3$_<4sTS_gt(4J!Mqr3^+|#;OzCaBKSNmhcEF?? z2BHa(BsqBG8F%cigpgYK13Q#?wGkYWef_|3=o5A4$#Ey&UA|+ibtHmf`*<|# z2(vteRYE9TSukP+KhZteuGjFj3w#3t`OT=dA^J|DrIc5VfqN)L8P`qMQ*H`-bfI5` z&*UdRdcyN(4=&o#O>lbA@63O>PgSuS&oO%`ri*Lqz?7cDd#}vp$tJzb; zEdk!o1iuSR67iSfl9dI~4e*rdl+lyMnsg-aV7+CU{Z&tBR|tt98B7`DqOMl{W3`?K z)L{V6Yc*@j)XPMy<;~mhx${{uh9AUFCN8GBviqDlf|1X4=bY&7dc9ob$|m%{=th2; zY?{maUrUrVl>70%)DoP4>EaGVUZSd8APKjj(usvzdB$Oh+<(vpqpEzQ9TKJ`zkbyK z9FNO}7Mqj0?^z7-)eh5aa-Z-TUrClx!jXA$)A5!k4&W|JY9x0Qy0H6lG0}}V2ygM> z+;I#nJ<8TDRt%LxL^0#^C5}vb@&xcR3}kr{l&U2pa#f?>&Tx_j0aPlzK0`+397Cj&5yMl*dm=}Zx4 zOpU>U(62$Bp~33Ond#WNa9*EDM`Q;;53t$f7_@Se#~SkOPxW8G2|oO6J%xeIrgzh0 zn|?UG&BT2-@B~}TKQi-k6S7AMaP<9{+g47O4gZZ24t1?pK_J2Q#B3TsPJt#y2z$(5 z3oA6}C&K96*CN+c5|^u6@Cvmcm`K2hTBbh&eD%S@QKzu#{6*EvWFtWn24K8I}b5v1%30pqK<9fdj!;}OebpCRd1@?erObo!_X1`f?QUx+mGu{Y`du6?j?HBis9U{x%+*a6@Po) zFO3fzYB-e^IFW6dGie;kMQ{Mdk16J^5TeuWOKEPBmCNGgHQfs1=&s0_2xcNaEHH{s zjb;v*1%!}PXb#|O(SG9D)mU-(Nu%-}=Tm2PflO1H_Ar80L-~88zhhogPLvV)J9%l+ zc{{a7`D5hNx@U=tXd3oHtBvGh$gNWip@(vc_b;ugL@1B#xNaC`w?BS1-9h{5aTv;! zFH2Du`qB_z5(F`v2T!jS3S?n z?rp)$Iio;a=6b)DBpQn{paPsuRPLRuMxXw5#EY_2Ci#%%xuIEAY^V1(4zd>``z^>0 z^HmyY{1-1zQZ3|BX)(J&{cVON)LbZfEDOxW{%%*tEToW>o3WG3KMZpu(erc|LwY1A zNZH0!&R&I;lJL9p8M8{&Kp#Vd6d?h>hhvLXRKup?~sEwauQ>`hJkWs(5D(kk-+ zra*_HG7jZ8zfy+gHPzNvnA?Wc)5O&Ldj3NKC5klsG^Q?Qo}6a3j;3Fg9G;nClk1Zjy_Q%7WlbNzH2Pu^jFZBy?&3m* z?cNFh5*v}XzV{-7MuLQ$|h1%B+Ih_`ifMwFAiYkeSS){>4U| zKC4;pi}{Yv-$6A>VifG(O<^y#1b(%z)MSF14UW<&shK9n&SB8U8RaH$HJmwbp#Str z+QVpn*mbk4<0X0Hpj>oCqDDSY111q2@F2bI=#8e|X1gjZC+^wR7vs3eKS4Pzym(<< zas49M80k%xqLHHXVA+NCNP}RfJB|;b1jtUK%*osRo)M(-dKn5q}%~t)}E$ z`Bk4yb!J>X5qziT8gU=2(;>CfEfa8CaalY2$gKo>M5{v^GQ8CX(>cu0h47o_>*~dS{+FSB|5Vor zDpyc&*Eo(*?k1|omJ9Nq(Rzsh*S>_&ENe^JhhShV<#jC&Y)L@Mg7~IFD7u}6EKQvC zZb)2$AhivNmH=4Q7n5$6+59ba9#+4rza1gSb0?1=wsnt+H`)KZlm?7Ae)zo-^vZms z@Y$m_vz5(;S|f@4G}OSQv&>LnQDdH0?1bTM>DVj;sng>8sxUoF0X+Hu{1E-A>ro@2 z$74`Ab`LMCL zjD(&fdcrzO!haFCzm!cSL$g0L_<%4hD}31a#?%sj{EW46s#SaHPTdJuY5SnNvSVX3 zJ`|UI2a8v5%d0-O7CL4)oqLH5Y)d;~Vv0D8DYbjYdXzmf6rt z_un*S@$9#T1)eK&V7}GqaM3HXh-AOmy=pyicsh|tTOncGg}w1%_`AyyJ4Bf4pEx?F zM+PbD32y2Rdw(DDP(lr~aV(J1~CK@uFG#(ib?{Yzb6@2zu6 zJ^l3y>Q#Ui0eI*Ax#?ol*KC2H(#i!ZFhkf^+b;hKpYVgvD@nJu%hK6Qti}1#_1MXVEZ-rA$Lt;Btbf}X3ZyJ-;19all~BJ?PI%oR z;EPVkO(6uyXg(qoFse`ri$7cy$64L!c7r>H3e^{B<01R!@erX-^clxvW`izIy0Gl^ zfk)EAaGpUzFLR>Y1PSh+f=5tht%#mM1CTw@u4@;P?U7^dY;{oUiGmd<2bL-}8?^te zT>;Ch4T$w-@$E$VHx}$Mv0GDsCz-?D=Q9ZHM?*=+Wt2BNg&~qEAm65klAlv6)19v{ zM+wv9Xj);X^{;##i@dpffPa|f5Tq;|;2XCFZC{FA3W3sOt@nE!HjWxFTH9iL+@Evo zy6$Mm)ah}%%RJRTg){r&#~(;$CoNErB(LuL8a${Zl`9C?v@-%L5(j=+9!YfEU%y}3 zc7^9n?k@Dpv|pWbvP@@ql!U!nY-d_DI%$3<8I~O(j)v_}@^WS!mH(j93l)iS)ribu zKav8o_7a#=6!Z(AF=s%t{Ptc&5}}TF$nFsUuX~D6S<;|Wn2UVXD4`7K>PYkQdR>nt z=}^|b?e@{Hm#?&h)Zf_SBSj-ctH9_h_ulXKlr6|#6xbGx&X5&_dSU%sv#X%0r|El* zs!YqQs=0p`X=>$33q4TNm(?G1W6K9ISt40J=bvehYVdvDGy&0dWX-u>zl zsVR7m%Gvpo)z!7(M*zB?f7eshewC*2C670&eKB0vZ>~4FL6Kzgv#fgyyiU>LsPhVm zKkH)qW8kr-%iG*jyv6#>L=os`MXn%mE(Tx#8B+QxdP;7*$I*ffw6hbQ>Q4=LajSY` zX!35jq|~E6=#FLk0j)Q;(o(VEB5@Y5$MCv>&$$)l8dHvgn2z5`KfFiMvp zUr=*`zRdsW?tv3!BN)IoJn*Pvk4e`NZ_DK>0BUq}XKP-Mc{i`x71EX_D|9|{ZdFn} zkRJp57EvHe&3Oe0yw zwPlD0%bwp&ObLt9TZ3Kwi$48Jk|BAO-neZUizDCIbMXzDwm7yAE3StnNSGJBVP@3c zO$A3;+Kni1z9?t(0mKji(q$1k;OakI#w_qgWP9nHlBE3FmrkBZD#eV9=lisi@On(N zO{fp^L4Qo|&Vu@#I6v~>4_D8#WW8j(fjxPGa<#--(JZ1nKO*NO3=&NCNV$j zOY+qnygBfuMROSd!(k|yFQ#7qgtvs4Y1@vtRoz%c8_1zD{QLSesd{>l4Zm%UoQrLF zXf*0mKlAuy7sn8i@F*+^jZP&2nCqv^)=4DHfapq)Fk?$AkJO7RIJTOFm&v&_jmK0h zy-;m+K67o}7*A@jP_z$ay)#x6eawsfK^+*p(&G@KD`*KXzq5*d=#Ogn9g zEOesFyZ6;jF;|NSy)K{>Z+Re#T+nFrh_Ne4TM}(@GWt}uo3gL9_mK({OlbI#+Jc*u z@NKXH?w3$oruCt5oi#HzF*ntz<|-l-bgFsq{gV}cEl`5M2u4DrOjHMRYk|^nyv7pi z_VJ&lC{trpQGg$If7pEI{Tgg!)wku>Zu6Ug5il$j&HZR81nyk`j=rND@}JSU@sIj` zad55wcv20LmhQxomW!t8^Y!pUTrzHfgG=kLaoOY@l*LEf6$g(v^E4Zh>Ku$FNNZ_( za@A&JZRqnM6k-%<`U#ioT$E$c=iDV(FGz=mVwTI(MjC#U)h^NFEhj}1W@PYe;#SGV z5%BVB4AAM!>NHT1ZnCl*z;j294+kU6YAQjO@d`;6T(9m0V zMrg|@S{9ot6)SM)@v774#&n$wo{{W5Tr@eE;TQXklpVPrMO8`OQEZsgIOAa`E`6xl zS&%+a=vc^irF%qumN>~^aJaJ_-)j2x-@ug^-b7VuuN#2(aPK%V=ZCGBoDtgA_T13Q z%J!&N6XJuRW9)|`m5br!?Op3V&dJ9w@Mhp-b2qtd*qr2Y`MUb5KWHuZjlt=Z`YF6P zWI&^{+@UfJjo*ggl23+2<0?*_{mmE-H^p3xem4(J;3B;06zp_>V}qqFIW#orLYd^Q z`g+>9H3_8~P6|IaelP=gVb8@eE0|O>*beQ&>&0qlyb7$f=%QFe+5|E@MV7NVYebs* z6IpBvtLUa&!3n*(_i2-wvqe7A%xljX^5Drq^BB=ogQfq#=A`f~TI;_g3S_4nbia6qGr{=Qd?hH-OIO5C94azuHZ~5!xuNGy?iLmd;nEcwCW-NF zTdD`7lG9wP=kwc|=-_iEc`h z*Y=j*nH|lQOGlIj4Pq5nC%V2Qk9yUx_3_!+eo&-olD_|&tD9Xv3b3^!%Y;8HFBS8x zJDSQ-FFYqQ$5E)<%~m=o`r%KSa|g>){O;=B%+P1^)@iV)e6sG$6-An0p(*O&p@sF` z`sH2?drut|fASjN+cKQkSH-oEqXB0TwTdGasu_N++fkO%F&u0{ z$~3OCpz^|sogwdHV-K4u9^D7C!kJZBCa?o<5cjT%ruXo+#)yz^xdKPbEi6kgQE{bQ zl&IJnT6C*gR6*7=_4Pn{^_*n?H%;-UMPYiAxDZo_IUoA7*^vT@%pg%vm9BToJHNt09}`B+Nw z+v;n~n4-r|rvczNHxVcr@&5VH>z3bL4`Qwm^F9`PW)a3_cg(sbxkKeS>R}I&MeyC0 z4c2{c^S{cX+z`jZ0J+E4QdW9h1Y?SVv{WB@o$VN(BJ0-KQK#vv1eo1SuDmD8q?UtT z-kNSdySWvvb-d&i@>zdxKE>O?vSEIsNb~uG#)tWIPUBmm8%bdTCrww9=<`sUS;rB6 z2zzt55h&1=w|U5SP7XhZ<`&8d-fiq=~KL4 z&CDkBy9v05{*rAvUIAC54zYp@$paQ(bRjvVb<31dlE~V+Yig4@q(*?kM(Sf;sa#}I znK)U1<6dM%Ig^%4aLGR1mQdIM`AHXGSHpD@6oeAW0^pI#o7>I6Hr>^K2hhaU+Px=q zg;yY&a^&=>GG1Ehu@$D%mtxNf(>7MIA{KaSwWuM!D-s0IbO5f6_u^zHJ{$E_vg~>J zFbLQ;BI+> zyWc*tmFwuHZWH}%BV3otSYc-~^DH)g>ilYW7ZFV2w#>{eKbp_L$Tt z*}UjNR2G~GYSYgEnsfimF&;)mrIAI^LgjbizOrhScu7_Oo>1$3cSr?J(Yf5vWLk2O zB|Yo)c5;!GV)P&D?>uh*r)EBsQT}U&o+t378E?xr1^j2@ zCed@&9++lA_`mA?{+_`Y-VS~&#Z`y%huHh;2PD)HL$mW_ME`pRSRg`w45?R~{U4A0 z_pU!;ao-U!{lNUM8T?66$ox7cBJ7a=gn@rOR@3r_7C$FY{qGt6e=hq$|E;qJ-k1xA!W~+Y`r8}^C9((~lybwRj#Z$gYoo>y}!~e@Y_pm?VzWd6< z{SWz_$N)=UyF-f+JqgDmnK$<4=sGLpf@ZjUlN8R(!k0t}L5ZVu>~NlW|Flzp$ZvOV z?@LElFaVQRRrL6C$^0e_6YYxM?Lqv_*PUh6O`oR=8gTn<2uB$sjh3D!f4T6Q9F*PN zUD%W&S7}_5ok02FJv0n3SPZ_V9^DbeSzcJb#ZYUv z$g}Ky)Y)>_w&yg)KVPCwgDLh7-m<1+a^e8LMMrS_;o0oC$nzHpN|6pwb-VLBYylrwS->+-b^1hzSZAkzvMJ7cDbGp zxZj2qM}uY7bHix*4AySuUPRzwcM53tBI}tjLb$%@qT(5!rp=dh1IpI}f}5*-Hrbx~ z{gS!V-}kfdPfh-P3Aj1nu*>@RcY_5 z-!XmzKKg(W%%+Q!ZTPlNM!9q#m)GME8XY6I#4?mGFik`gT!Ae z@!v3*9R)s5$b@2t+<$>o)9>(wPCxtkU+7RGAOsG!>+!ulT+08;Q~Xwnl7TS^znIEKJkH1cJMKGHth-F@2_7u?H?Q=+|DoEkIuo{$`cvjK>elfSQ30K_0N04 zHuOGo1S!@-MsuEeKKVV~LIN%gH2n9Nza{D;baCO~f4_I|@OBTr;1L4&>zy*XEEM6l zOpj>2|Cs$pQg7j6_uC1~4%FY{dEpY~MGo)yOReHm-nSw>59jWWb#CyN32nk75-k;z z`a+_d9(F7k)RV+{bbV@njb|HW^>?5H7l-LpDx!>W;P1!+5Z!rCZTjfd4p|h2TZwmY zWv~`kFTyQ`DG7W}q7f}`ovbe$$z72gf5#C$*znoEBG7Y5{#GsCmsR*Hh#;LS-FDP) zeY}L9hQ#T4I~Mp6j)3nei{kKh^-_EpZi{xu#(|HbRqcmuFSuOi^emwfCU^8IziPnBZ%H!j38qr#c@A(GTYfQ zuqWK=Io+SnZ@`VFSRa)8_tgxRqWgWjulh*4{AK6^C>>f5k&%&ieIXZ?kWf6|ZD}iO z>ww^h-{#}$I0j<)4t=O(4ET5o+=z1YVR&6j=DxoW5Cgf}@PvDm&}!#iRMPd+?8lC@ zD)%3sG4J**f&IzdcW-r*z_6DaA=z?(|HIyUN7L1|d!q=^TeK+ALr4%ri{6Re6E&hn zZ&73EJz9tmEl3bVP4wQ08U)chQ5V6&!nx;qpMAb}@BN)KzVZEW&KPH$|2%o7Iq!Lw z>-v@Jn*7OaGF-b0{m$dB5yZ&Lg=_!5)5mjU8TY{)Cd1v1ndq{L&40%4;qHk}BihG)eeHyS^ zr?c+Fze=9v{TgiCdsPNSPhH_UC`Pdd9I{Wf1OzBE@B0k*uvay?rq- zDTmI4*DC`y^8Asi(8hTOqK^)T_@F0r{5c;^68E$q*LW&yhUs7LSTN{}%~;Z8=*o%0 zkhOS{YHDhTR&0sDfa}u$gEr~>-Z|HvI|=RRe1Di(IIoY*u0PB4GF%;CBSAjx;DN#M zJ-oc$@369nxG_vjOxTfc)wEoGrO~6olgYmNTL2ddI1G&3v9Z@VMrUA`LkPAkoz>5pFR`Um^*Z#7MRr$qrjk{-i>EVWE0nyvSg|kA6a24Mbj&3g$A9mWHMV0NuuO* z+is*evFGW4oo&~Ys9T)mm%PY|{)A|HLs2H_jaVNOi=y_p6jA9J#}`rWTd35S48pYz z#w}Dn*HnEDe127-3vep(Fyvv=8=x!*6HjEH%h?Ct&dyF3?R@^Uxj-TDi8v*fVJMIP zmP+mFTa|Gd=4TK6#m?-tkL01>ukB4X`y)2sr*@j;{#J(DBoRe z1*(XAX7#_n^$bkHz}AjQNR+ONZ#ge+(Wb!mL7i@FkfPl-vF3pURlbPz#9!F-fbi?c z&E(&}s(>dd(zhA3oa^byYvg0~kGJF;KV5+mNKVC7cN5G>>Nycem>;@p6-S zuZO&v`IqeV^z{C~EY+ryG$f*+xXhW{7ha3{@JVtAkorXaV(f$T`1AndvjiOvB3$40 z#*-~Gj!hK6UM7|GyCaS~=t#JXqYps3>cwiDXunNhj(C&bD=CR+BOc!z(rq6WT{u&J z{Wp(6&rh5Xgx(%e-3bW}Hs1M5v6Cr_KUtR9g*mZqlBadUUq~6B<=r(eYHBhG6B4oX z*ets~FVnmIVN-zPDO1}9K*>qIW)CPk?w2(NPZS%lynCXzSrajskA~H+3=mC*Z^$WV zGkEYcNSi*6%3;NO<*we5CoU zuv@;Xsdk970UL?D{OZ2V!QQ;7%ieEd9CD+hqdD`OR%1L3JA4$Tu&bl&6~HCF;MutK zZpO}Dye!BRT(W04ABiaU*wUsb3Mb+SxC$3)L~roiT^53@kk&?s0QpfJ+yubtA5FE# zS(f9{Z|n1W83hf?s%Jin@1xu9g@` zVihLFg>Ye9TwHdRTPa3PT7Hr!JM-ZJI2K29H;~}V1+8QlpT+3>a&sttM{1uN{5t9V zkb1wgR^}b)`=3kMh)(u#8c>&l=D13zky}wVak6-eXTbCSSd~ zd7tOBfY+#0H)Aw())F)q$fzNc8=VTEc?xPog%AHY-yOGI+4C9fGbidxcR-z z|EsT=g+(3>)>{F|u4svaV(5d1pepw^Y+WWT8$^9?(~rp!7Q-ywwLzax%HE`iUF=kG zDk*6uBvMnGB$6fr@bP8zBRG1-mzkkB9Qa&0&x@AW>4=JlleS?OGYk6LQOyToJcXom z)4HCy7iYbS61ki;eT9i7if{W}w9BRPTTEQquWuP-Nkrxp~mdMt<*mfR);t zok^CvpRBU8jGUV&jH(@icD}HTOglZJ)4*2qtu%6Y0?vN?S>WqZ zRrnD8Yx0ek%n{$%mhU9=)dOl^Thv6G_^Wd||_{OpXu1;*Mh0 zIqB#m(ZJs_j!#TWiu`8Xc25;i~dq$%LU`SXd`3?SRyVBLG{ z#rsdd1xL()Tlkn~R}ouX4^az9MnZ?F1Q6f>P97e0kaMFUh(9;BW9EFyV+1+^b>l$1 zTKg+t^aK!?T<||_NNWhV2d}t7)EBv+hzkgFcs8}v>RpK9K$K_!{eP1ZtuCcvgP5~; zGUIGOn{tR^azRPpP$5wc2zXE&!2sF|YO~-=qwdTOBfz=tJ;Vi1SAGuHg;3NAijpl5 z{%=12|EFaCos!AV^3^`Ns3CY9R0Eb*^Z8A1P_5AtQOZSYgoSee_EgLKo>_Gq_?j#o zSc?8F`|4z{Ddf>5=!Th{sEt2d8r{rnHG&rN;SI2s{DHkH(6(9ZsHkbV@&Cp)`+snm z7q2T$*$(t$FE6fRLsh?salRgVuFt2-7akf)Kuw>>WcFE6**fj#N9HO`rZ8*@>O-+` zX6@u0U8PlNnWlj>&dcll;nSKS_s5x4r@#Hmn)3bU$_&cJMEt&9T+L2?|7CjmU7~{v z6GKXBnH`N}B8-FtLq;lQ#l!5zvd|pT&QnGTCz%N2mgMJ-@7A1{p;DxzBg?gsi`^gX z;j}kySq4MbGooR#!Z6UZOmNVd7%{&ItDg!m!o~*6tl7aYY%wyzbsihr=Yu=@o z7W`{w9Bbxg4b1%4xEl{-PS?|&fBVonlm|5&|1z2*Ris-2LWYo#$EN0K>kZ;5o6GZK z_qqC4?)ME!J$}6B@p5j2hi{J+#Di>+Cc5=0Y4%{LWAe7&Xs*1|e$%Pv@%E(Ge#`Zh zp{Ic3@A2+z0s9pDsq!V7Y_I+KIdP!6?p4n?xo3)cnXXh-SoGAJHu+l7@!!XJEQNy; z)JQV2EX*@?%l$1vjX;l27Y8gBXzZ1X$p%CI1yqP1gIVGY4sS1ZYqA@*OB-gj6z{CT z5KGvnn|bl|Hrf8a0NeF{#uHYM4g1}6*ngkx0g>p=L$9Mjp$75O*|AG_4+Gmr05plc zfI3s>d;F(PIf<=KJ@av0o%_ZIgtV=R&)PeuszE{iilgI6vvf2WB%^km$a?Dc?$b_< z-QVBue|5@ez2bY|sFLjH-_^JeVTw2kcrpnDvj!qW>ym0Qybp~P6 zZwk)3$O_pE(H(s&d0Npvl*wlm-Ei{Tes27W&YXQ&(>izE>MbFQZi0)Qa9XE_#3QXi zHzr9WU;p~7Lgn>$RI!0fLriN~QRpMdJyPg!2#x;x$%;Bb>axLbaQ#*j6(7vT{`#a$ z27vK!-5sylQJ5kf)9agrG^?im$9hL4B)_WxFRl~aZyfvXG*|!Tl9WZEc5AGl;bOmK zq4B}s2Z1V0!QW{%SudIY0OkIfEYhK(i_%jpi)rZnMuCSD+u*lv;PeX5A!8Oij*6#o z(U~+KlY!TL-_-p=FKB zlFY@1PwdG;K)}&@#_PkrJs^lZ9Ce#@?Wv2GIPaAs&9!ORt#;>W`ujHO3l=_QZQLEv zdL4Ctzqq428jG03 zY!zQm{{W4tXW`{L3Nc~8o_6=a4^oX<$vKtG`17fs-Cu$z#%K%{k%(%)T#>BBoTU^V z8VEvQmo($6Wt-MO^u0;5fLF**cLI=b%G`AdxwRsyPlLI+1gAo z$*wx@iDHsSG7Lkyo~YPGN79xyiz50kXcStE36J4pl~yW3cH{RZb7ZlLPXwK2g@vpK zZl8|G5>q!L8PGd;b%SWdeZRen%U|OCAmW~nOWXN#!obXNp1x5D$SQ&wL@%N^-6Pq% z8IfOKe-|ohhM&$jx6HNg9gHg>Fdt1^*rgNH}NcunO+EtHc^dV|Q06ST~jU<=ow zU=96Vp-3zuom|iM+7V1MC6Q-0wawGJf-vXt!bIGUK)ExNzHu0gqm}nbzz+@_fa`nr z^VEcC-z}2}?yQ9@GIhr3!?GDp$PO_{nN_fequrN^446oSz^up7vb6nXfrWJGG=aU# zh?y(H_->h<^PxZ~c=^vUfs{R4>!!&3bhANqFrc5(Qp*J%wZBxs+}vXZBc>vqz3ssT zvyci_g_0Z&W?*2a1{z}#J`@?CUv9qH>0Ey{u>+R$-W`zAo1#-m9#BZ zdU9FlCTlMybiEWBjuH|REw>(ZD_hr$J$tGD^l0|yr5q813WdscI~Hn`r!5QNKIl_G-NzF=sL~>Nj5IPEQd9c2G75>CfwGw=D7`{Ojehb~X0?cd7|NRw zj Ew0a{1yOkuPZ7MI3jx_e2>qX^f`==Zi>F7!l3qRZekGT>_lYp-_9yu`VE-W zM09nTQ{O`NpwCFhzlgh3gy?_Ix62xsWW!e%a)wIC(dQJmnjikx$=)u>LYGcd$L#0% zEru?4I|Gjq^G6M3Punte&3vcx?CnHx)S!@HP<_NTx|yFNe2X@X?fEFqv$c0)y zmIl<(uVZ3_C()XI5i=w{*8OQH_@xK|Zv5N_-1tG3>$V!QJC<~s1$AR$aATy4%EU8p zd^s>&)XZa8cktO6k`oV)mLL%+AQ=#Y`_{o;F zMYzDW|E>T9+(_HQz7nj-r`zDg$dk6c?0gF^ptWQ*dO1|Tw!q>u(ZioxU#Hxcpit6$H0zM3{Y))s6pXWCmb(3F>gwkyQ zM4B7Pk)4yqzO$ObW434Nvqs@Hp=VIH-+WO@5CMGkIS`qCOq7`|_#aOgP(Bd^=11i) zKv7#a32rY!$?y~)js|d)27ux_@YT5PXPn4l;EmbdL>3d^yYJ2d&`}#JG(WZ5bUN<@ z@D@?xA(XXYm*?+}r_0S{h3tPl@B%5lzGmL{esN~x7yHt>?#s*lfEtOt+7+URIaflz zBep-dAKOB(i_v6=yiBJ~wTSY!M$o`gq6ZdoqxKdrgvxKS$~nqR5g(^J)%OX!{MqRU zG@ZT5AKdQOz<-_f-TrFB9DV|!%dQxz2A~kNe+2^V9$>&V*#O#A57P=c?XYQN?L79_ zTm*U02Ezu4fbT`J#64W9oVHG{^P2bRA*2%?!5jr>&|X9kK%bU|jV!;Cc&?h+pZjyywwCa7<*u5UiqK@jj|fjINKg6Mk~O;x!NBp-)Ff_+3IBkFD(7BPy+SBqby*% zi(@Amk(|ih(F&=Z0yuIO0Lc1oB&~qms`XIDON@;O23YxU^#aTffUY-{Ew1w&#F9IP z-|f~?fWJctGpYA*1;1A96W8bokY!pb{3?9v96;+?FvO*Lul;6y1|YF~2c-e0v!jX( zjuvAF=ZyIWvxo}!&PYH#LVc-8Lp}8R zKjAooMzt`fXwC~DxUXStOc8W1mJ1*z za3-RMKJo3Pj@OiVM4d&PNcTjk$xQnqPEN!5pJJ{@gk@^^;fN*U;VK>YRFeARzT^Fc zh4w!xGmrl+}8tit}WfY7AQ&=sESPYrV5OF6+Cls7&ohW%W);?}aev2{m z%?q6Qec|*SV1=i|G$Z0 zKL{BlW*Zqn^~Sfc%PHkJ(lc4przU`vJs6IZAzWn)o4{L}{BcdqXQ@=^84;$Txk4W8 zuIX8rz0Al6iwP!d0v`*rK#WU$y0J=rk^hx+uGZ!6m;9i(R zK!vt`H;ZGHr-X6Y{P(Ad{`c5m?A4>i3TclwGy?scwOamzWr!u=lcu(nDv(_t*dLxCyc9|{z!Hj<>mV>s zUA9}dk;V4j5vlVDJt>^Xg}^{vA=LGeq)ML=IX?~J>BSuuDBE+M zmM=;7{=#vtzu0S-b86VNHVwz;X&jOHY`dDNxt!W$2@zy`8{fqs?Ed zcW#*G34da#d&r#ea&NYdl16VL6}BV&X_Vn8CqM&9-jUTWH6km%{W)>-M)0};#Uf`5 zU2u0@D%G6@b8>Q#wPYQKJhQTj#D^3_UcXhvz9fTeAw0M@?zzAZ~OY1 z2;?D%o>r5>K_QkoPizXeiCwnN1Y}56Ff$~-VOIsI%JxxfB~xZjnRWh>_Dn!DV+BAi@;SM z!Te8ZX?$HLZ*q)ziDC5fSr4HfoDZMy#iniX4_ogTHTiyz`tpOjVW9iDmKK2@E3Cb_ zE0>|{c8s6~T4K*944ms8S6&zH^$C6$(pz!f=u8dfvn1n6)Y%7?@cF`LNXcLbKvt|Z z!EfO*ed{0+tpy2s2r4A2UgDu3?X&NoRj>1L&gL4<8_e(g+jsgPH@c|~L8PXwLerw$ zu3wFZ4j^>99N=CXKuxF-iVbZT{qX4Ji@OORnkin~;SD~Zeq@`_6to)4n&SvU?0dZv zJMdWQD;9+}E+C_MB|l&zh+93g`jIldA+|%Rqf7tek+q;-^}MgW$}bxYn)yoK<$|Xt zO2|+jzb=cC7hJy^@mxSyRfTu_NP#kPGwqrBY6A|>W1ctGgCDGxBYy6Af8PLf^ZaCY zdkR6-*6GDywJ0=gNp^(L)D88V_t|)MS3!_5p9zMzTJt`s&0P{`U+G+UJ0AUt;V$lt zf8isg8yHdKl47dU-fp1IqXxUopbZ~z@+EV%DVp@>%<3c$XB?_x;a%xHeM#&yGip~p zrY!CJ-ek&=J=hGd7w_o|uw{rXlFCQYpLpgZ^R4iJRQzgZYLtF?SnNpkorU!|fghBG z{Km?sq~7@a>lHsORS!B6bs2y2p;**KWAe#jXvRN-tzeNXq=y#6{llNASX!Z> zU70w<=8JhnQVq2Zd}!gG;04J=GsNfgx6e=cg}D&PO#YcHbB1pvi=2o_W~iiM=VEIN zy}heaBI@Rcvt>J$ANx+Lo3TC${YS-GFKkI*rUrxbKdtTP|?_mhJVZk$U^*y z3c`23HX=Au#BWL7eHAcc8PjCT!Vq_nGmg(lPP_5KxGwZ7=?j%o;I+Z|^%>DClz-Yu^3>psDg9ec2mN zfc(E|(*@g{9j;LdDk`N<7SSXP^ZTbLBgubcMb`q7IMOg#Fl`P88Fw#Ty9AAja!BIk zssHWZuo3zGog?j@G6d5`1Rayu@~X+QR!{n%7bh0U0h$jM@sPxYgBLij>4==)v^+_T z#%c@U3a_7QpT*u5B;>&anI`fM#uswQ3R#i$n_D^b?!kDEcvN9c7&xDwqI0We;5V|$ zh|ZBog0f8_$AK4wtgx7{lJkE>@fd(NYQ1~h9*K`zD62eI2pi-v#gx z!0gEi*O7CX_zrP7DV)_XaJ^~y=WSN5-#@!-x~ApYc-EF)e%3|j#>-fNtvx|@W-?6! zeI8^#aY*WjKl*N6B5zdB6MPTB)rIGxwV1JYU&yqItOdR-`wIne4M!6_=Jnpe64QXU|7BlrdXiNuS`0+fcNQO{^dE5I> z>uWZweb&<-Xfd>+jmj{Lf8#R(#brhy?OR@#^UvE!O(^Wp53t7QyTsniE&22S%;j?1 zJPbM>te?hcOhm#LEu0>fr2uIdla9erS9=4%M5bXX^Zg0&vE~wyf4T615gr!Fa-jPr zl>si{J(x?AN&DSY@zL}>SR`sM|CD{E> zU~FG#r?YBg0yXOP7+^3QB(0A!N+Wz}o|gC$xh_wVNrkom@0m-lwFh@Y7o9e#FLEK3 zgoz)#FbM`07>^EP;7ef>;^Rl`CCPbaNos&h7b@-jH6q)}O!`Rq$=(K*+$DWxH z_DUYL3w{QHRekLJz?Rat(138EGm2~u(8E0m0MdgWS|>pg<`@K&O6@00v5wzu_qncv z7Z1TER)38iD!h`hEs(b|sUU^?Q-s>6pCDH6aqx8H!C%cXnr01&v(8tWBRS9EvXKTC zC%bd2eMxs=oUOZhfhxY}m~)C){)AmumT+3XXv>e#8@5t`fj2*Yaw=^uF%GC}z-cc_ zd@bNFbt>F-oe)`Q0(50BH-_7-4mPk-B&J-hZc0Y#qX{$fW1{Cio33#%G`k@>;B1OScM@s zqyhQC$a{=BEOK#RT35;CoTXBUkNr=kd&D7y1H?)}=}G{}>Vb4K--K9>*@HZWhx5MM zTx8Oi9;73R` zdE^=<^+DXPS`<8E4xq+ePXL!r!6WJ+HO3Kg4X)a-8FnPjH(6-YhxN-$cYhEO73qKd z;NzFNt<0Xe3Yrb>!ga8Gbpt!_lgBY|%;y!Gd8F>#z6}(mhxaBDQJYU21QzBnN&1k8 zGfhRL7?A(>0&ftx04^wmcF>*S*3WTLvs*ngB!@Tu7B~e{8=%2KDDiC!qAkRI(!{F{ z_%wCR{udvn&VZWXNDxZU!t<=MGc(}oOt4$u$kFO#=li7T9;hs@YH@6YcdxIt8NG8J z(iqMXHwn2(Xq+wKKbycL%L?N&K2+v`rkym zn7}$9LCiK?UtO@l?n$`-3jX`HcZvik+!Y8_&smNT5d%N&CCC!FN?sxII^*N-|NL<+ zeGg1;p2Se(FcX+Pc-pJ2r_3;we59hSG^2kL$#_e9$Y_x3YRG^cS)X z!wf4ln-ALY9fMS7o`(?5g0lKQal*?uM&GKQ20&csd;mfgabkx`P(o^W{OV6Fu_SV& zJrALLKSi7(2Z4=Yzj3kllK%|D84Ga-`k!x=4mvb9ja_ zav+trmX-eK<=gG?FG=a5UZq@9#Sqeawf*aR*Bls&ZOq^KCcpGrpiO6{ z84~z$b}$Y^)U(6-Bi=5h<=pz66G8t6A_c)!ug%fjT!%o9%}AFc1;CYk^rAlXlBhinfP^r`Dn@#Ke7GhpC4b%1RXNm^toXDGZk{fp%fs5l%Q4O>uw6 zxF{UbdYphdq0jr~kEJ)hE$hY#I*qW)$1rt00kCKXJKyXk`XPJvmksE)m?WUK4Zu$E$^O2=p|a&xo_tl|e3tL%(&amgu}A>zrO7V+Zi zB*kFc`ae_G%;&)wl4pJIY+&m1nLK_MCf-6!IQ=1(|a%WKW?ZNh(-euhBM=G?e&r1V@ExpOqM4W0VaK<*nT&!55u4 zLjLC-UVsVA%$x%vR0lDt9!MaJDg>%XPp68Wg>_XAEq+CaqvSQR3fLJ|8g!k+uQg3# zT_ih+C*}`)m(25)9A%SlU1190R| z*x~XTuVsI!T!>cC<+_Jt+aiFcvsPOcLviP$9p)_#*i*42hRS~|%^HW%HzU%2NrDxo zXtKyVaWTR%{b=avpAhpH*N&jLQ~AMqg0Y4b&!J|V=$>#fK{p1$sO;U!_olvmo#gL& zAA9cD>h(V*Fn|_F%+R}I5F`C?sBw!;x9I6fr#y184?ctAv;F&fvCrnXn<8UhOf@UW zSbRfuW_q8!!Vz5JLjo3n^8AdFV(yApl(#Z>4rPyJkevS)=MfPLeGBN;(C&OwLlnK3 zNaJ9^k|Sed5daI-(`!I<{wl|}v2ymT(YwNaG&d}Yte?H=9*ZTR>${h#k|z%(valMJ zBTGYw9``zcZK6yf8G4KF8j`v7%1q}Ds}FuIakL-3 zS@8}Y%z6E!a?C=@6_(GyXJox&vp}UAMGx>#vbUNMIK$&iz*Xdb-ime#^tH#ZpM~V% zg;MuM3yZqLKai8PCXE4~`@#>n&yLwtjfxo>EUVFf>>t#UNIz(N7CP2@;|v_>l3;^; zUVeXtW^Is=R5N^bC9luoaUZ&=M4M~e>LjKkJqbUJA(3yNDy?0{I|Y?_pZ0DNSjfD5 z3USe8fZzy)BV5JVUV&BCUAL@(R{6Oav^x!fX0H%Svj)WN=M(eYv9ufaM3BJioE|un z#0a+!4&T}*-BX6TW5$W!JedS_x&RyXZ?34u>@`{|aWcyR&%=g%J|kz~CB z3gM{!{DVK}wH2;#m_rue^^D*z4msLm5%%KKNW8AqdvEy7Hu3H=KdW!J zExG>_GUECBWkH%(6zB6~Jp~snlQ{hcew@qs5x&(ktkc;AQD*IgaEz`BG?@=B>L(Ot zbU?}aH^B`EXu#9`6b}@)pVR{m0Ur>t?&zV9mNNE4nOml#7LYDu&rndZ7V?&a6qw5u ziH~ulh+TWX!2z&MaE`DM;^uM`?!lU@onnHmw1@7XkQ#Y7Kq%&j&&v+t<2uq7?~;^Q zTA=XH#Z9sJGt#|&|II8w|Lz?siYRu!91SivPQxAL79W?z6b;V#*OT{O71(cKPrT`MLP47>yVER8>E8mcBeh#2et!p9Ld+Urb{|H2SCgM0EDee|T zEIRK1%os?WOD7mp!78xx)uh4mt!m0w5ypfQ`5DM|vXwJI=iU|GaOwMes0mMhVkp1? z=?x^%uPG}c6XFv-t#i>QSynj=5(YhrnW@zc99tHyvFCfK7_;z+m(34FGT#BeZmEIepHdRVfC8K}uA%)VMlJgW+)75?-`6Q#Z50>qlwN?#^@tQk+mAZ?`c1a zIg;>n%oNK!6owMDp{pJGk6Hlmi_^SME=hrZn7*vN@*dB{JE)yIP}2?!sPvhi=W@;X z?a9|*@Jjc=r7x`nBYeQ=yHBLowSSEZP$R`%cosA(WmFn)Z1-uN?Q%5#)wSj9o~V&vcHMPq3)D0``cJQ2`P(NNZW-aiLGm=iE< ze2(AkD}NqB?U}ApG=o3F8-D(5Yhv(p@_fqz)I{=w8L5}~tH9qOZ~!21EzzCFt9N1Q zkGEKR^3&%Uyu94k2V8;DTLu*~IWS519IlR(igEqUXaK@I;rQyNgoNq&WcXKtx>-2SQG%L7C~^TNQ3s0sCJbV36R0bh$CJz{s#(-2FDD z4mopPkl>LH%CTrgJxgdGdlUkzDUrveKs9aI6vSk&!#?(gng!TQ6DTwKbq%WOm;aaP zM~C0R*+%w7Wr*he^Gr}JGYy|Q0BvRs0Lji6Fi6vpv$aT18NHEcFGOR{h-ou^eNNs2 zUy?~daXUPyWP;?cwwu%c0tt~@_-`a+NpRt{dkyG|ypW;Osse@gioMeSP47Svdaq$$ zf=otqr#u8q^8PGnYk0Yg7xW0StWKtF8j8!BfA7|=#6jMT$973o+{}v@t{o&OE}8-{ zSy50h8<@nu-``myev#Ef=l+Hk=(>PmW_IL}>*FUal&>cb3umFV(;B?Nz-bp@(0}V5 zhfpIjsQg#m8aST}CJZ^@O-!&XzdaGJR&?yzv!e~#b8icEku~y*8PGas!~7XwN~gA9 ztP`K>t4p;{tIV*2MUoeS&huhWO%a*s0_@^zY*50|>0OnST0rs^x~J@lzYb)9W%>aq zo6SiLWC=Hlc^4lJp542_VgFf=R4H)4t_Wgiu3M=F@`W*5ZvI-RSHralhZ`CxHIdfj;Ygt=*TP z67boQE%5x-UXa*z$((`Kf^S%Sjv<7CF2MUP7F~{HaTpzXaS1Bv?rrmrrKU+(@XnW+ zN!9@H`e7qT^WpG{7D#Uxr0cRk`daHE3_}M^n~!UNu>f`04vPcov>x@W&h2wrv@o+S z2NnE=kb_g&e~^-V#51qCS94|omwGovqD~`=s)iol-#)%Qj&6QPn>^UH7qO4oC?!oP zMKaW7&Gq}L%lR9^-UAi+G$APO0E*R0^}iaXR4oZm4u^_Dw$C2qFk?LwVOxD|Y5$;J zS*Zmum|63PJL{mI!dfN#8Zc{BDR_RWynU1J@$4t%Bx5kIv$J*Xj%}tB;0=pS8mhy* zNe{z%WgK{&fQ&IX{$fgp`X-Pl#Nj#;$ppg$?h=1TWKELT)Cgh@!?1e0L_p`i43(sS z-MEX{Yqls4*g3#1Er!+-E=(S7UX*!_?nlXZTGo?%Vroe#_njDFn%oxyk708x~kz zn@Juj;sz@K{W^lL9pWVGxOlgAzAVejzF~Y_ST7%C^@MxnCF5vj0xO^--PXyFzXKIB zgtdW4JOF9~1|%eafTJdt2^fifeQgnM)wE8QrW}n3&nhbre}y9%5FhJl=t&_u;(NO1 zNH0h;FDSyv>{V{@)FgpQIXsH2T$pd4O}C;_HwTn3)= z=$jtQ(T++ zv?z1G6?bE{Y>+jR36|8E@-I_EHx?o&LYcsm!O@_Rgf)hh!mBgs=mpdM0#D}0jJF(d z7Tx^%*nuF4=|sL7?aYqbYHy-GbJ`IcdGM=QK8AArUCwJh=QqH2wp!*K15PN@-`FOH z12!Kl%4jPH?B|5KxSwwoH2j$;Hd4A}`dCcf+mtV?r9zQ}_7i25IjzX^f9EDOl#bIm z!5VwJGMr$zJHqT|IPi4K6UzoDsV}zRd{Rde+#VSdDKr-mBZGB zd9bSKo2p-BtyWwe4tX#*q(x<J9k|Ja&&7`5<;kG%nv zKR9kl>Ln^arM1fI!)3ONKKKs$@Qmn*&sacL)wj#}LM;}s8#A>=0vj0{ABHwRF#Og# zkM@5-K#I>x+&6~wmk1K|o0s6N#k&8{kNOtM&awcQIC|%mMjaGUuUyra6G1y&NuML+`kqMEOB0hfZ^2VNLSxCqlh@Pm6>y|S9Cvts`b}vWE&2P3pGM|Ig$c;r3 z>b@t;zD3Z26to>_?VsKUemkX>6nU^gFWb!PX^g-X+$d1hG3glp*x4@(WTSd|ao<{y zkDlr2M0=DNe($fhjKQpSWwd#R_t}B&610;~*`)1E1C@-9mZyq={^A$moyX(-a6c|6 z7m2PW$Ub0z;?^V4`d8c5qXc#+v?>f_b~0>A=IXY6S@9SA09A1ZLOvrpwWN9K@{syZCX9( zD+x{#8~FQlj-1KN$-?yTj_~Qs$FC~=M@ja`_xmh~Cxv?|vY-8vRCZoR?^{Ar7x0nN?^;F^V@WLui@qY2?(+7UJW`!SMqhAk-h-;GTp)kYq-ZTM7dV zd@*2ceIRXxM$o}F%*|FOU$x>%4pdx_F6^31u_XOz2mOg*t1LzBgXB9!NDW zsGPh*&sa?h4iqpoW8@L#8uX4pQgvs5A#&EHw3~F)Q2a*#AaN~zk`VZ%*to^>eAQku zba*5iQEIZshYzRDCs})JJ%<4k1bn-Im4Kr{Qhol z6XsdS`Gkp{hSt_SRx9e;i#%oyW}Ff2gspKhfZoj<)U0g!m-vPF5UU4q=p!=K|cW_u&k%FXK_CtE)*Go(~YDg5FZS9p)_dGakw&PU*Gr1z>H=KM`dIv0^}s_N5H6{OJ?z zBSA0Kw}X`eLYS;h?j6O;qaensQY<1L#Nk)T*eFH?GQj$FnTQL3sI>RNzSNaPG49(} z%3k#LBUu)5M^MI>QYBmaVe$$TDHL2@$$kwn*DnN+32a1ms zsX~gHJ|k%ks%%w6FoRU%S6wKh^z;C;3TmaBQAZwt&Qmp^fUDPJEabEwwYCToS9}P| zfFwlrFtmG#kcmCQb4*RBjz+)^1;1ft&P~U&pia(d$%6dh#}@P(H>Yg8<8ZWC9EgT* zC)f?z@;0y}_>tytnN21IHYja!dEjmOvmZ)Ei!N~%8nCl2S$_9*RkB-= zWMcf@1_!?%InU2Fg3?ougiAtF>1Vcb=*w8nB*BqyGoS4pZX~!)E^60v9PAVGE zJxPH7-i^o3n0h-N1}p{BAM8L9qR+^No%e|;=uOMIV&zgC&?LsoSqX!hd{orR)4cHl zn^aLc?CSEO0hmj(;J!YtpY#O5s5OH@VR|y-7Dd6%X%2Vc+o(VUVO$N^2%+vSAiA)( zAm2vtzeczmk#K_?@Z>XaOJ*txhJeq;MKEymO_S&XFt%?bBExwhn{7ri0)jHVjV~|( zL9P)G#7WP4h_U1W6#43-DIHs=QznUoUrfyurlxn|VhXJFT`|nz!?hnKEwIZ6vxD}~ zQKOb8+pGb^eH|`?0~t{NWt^b3Oul|W-sok{+iM4L^he$YivkcqLh`Ep&+6pQS^jEj z2z4zBdBd9UT-NZxm5Z)%I`PXw>JGh>C|rL9CSWz*#BOL@R$M?=|1l}thz`0K)Tu2Q z(`BsuEJnoQlU2&1kl1YyjKY@QM^^zQ11nZfT?R=RZ^qfWgvDGYD@;YaA^i6NY^62W z;a?IMWYR6&W^2Y4A1Bi=@5YT>ScV%lqqSSTH_0Cij=_GlD!wfdoq<6OvSAY}@rqUlv_3nkC0W~VAFpsH%e2p37m{$vhRQLwiOZUMejb;Tm!*)JQuR88K@qNhnG{i)cc;3i5>C%IcvHRJ}0svpdB zgt(XQ0ww0#S=a=q9g{W`jtFtr&5K+pOqi@iCE@2#@gU`}+zI8ntbexuNrlM(NG0ZE ztl;Z5Ieu4X8*||60h>;>OE)|Afdj@jDoccwegb{Vq*@jMUSJ>JOb$w5CSd!`f?e$( znzsPlGqzA*G-1y;5Tggz$}m=-Gc^=dkzD}YfAb1?q){{Uc)Jz?Uqh0>(so>tqRIB5 z#XslEpOtoS69#QyGj*AFes|abdig73Svbxmj^%#aG%GBmLt7k`lXK;ODD>p71)nD{ z6+4H4OT2-D3-$ak1q!Vv>!??>fCf5GHf_Tir(MbiPoHO>g2Gw3C)~@}#6u=tb8AqI zwrCEEXY=KW5$z48j(t$&TanrGa;Gp(94cW0p6&3CGr$5BK0XKfYh)+-iKdMPZvsZ7 zvFm_u#`5T-10wQWE{scbvf3Drl#w@a^6OE;saz!3zoCmgR+}i1AqOpxYTXmG78yM? z0&#l|sw`r93Drhl05OY@Ig}XV9u@oulzSR_LrUAm`QI%ICI>VB<9DI};mm=0X6NM% z5Pv*`=DqV`gKV~-Pu9t9V%~)vF!K`CNjOCJ37c0xJR@{Bb){7i?uku&z6<)5mcPuS zcA*y2KTVQHY`VqzgD9V~Nf?mvcN8n2?X4EltYp4Ey=UgV6jm*jPg>~#zM)jl5+~eF zx%=Q3gZE-kr38O$+8{mUbf_=s%@gnym4=ex7t=bVk*N3M;BkWVJqQZanRrfjflLA0 z+bYNw)EMZ0cYjc~lQgOU@;H5fz{DTT5KS`T%-b~#n8ZH#z!Lor3z<%TPzvy@tm7jw zPSV0hM-AWX(>C0~G2 z0S9!|I9w5iX_^?Px65@TP`hREfIOcV)kBPEORu+6+Y`kbY-%4?fg8NKK9p&Xe^La+ zXXO(dF3QCRal=5B6zJ68-T6Wg@~`=0c+wpkYY=K@tM=g$Z`-rxaO@YN@U&E*0h z>Ft5jckkX#>}!@%ozi!pl9PAl?$hMqj@6obWJ*c}?IKKaYcKN=gJi;)Y?!wKr4qK4 zHISO0zyiQ3UA#hxx0Ty>pII;~HNG!fTarc|EMN8CFY`!utWJx{ENi*?jY%SdIqEUM z+fx!&$PO#|?Su{wsRi`-x8a6$CHq(^?#J&>$jG>0wP=O?U0p!+i1|;dM=hGx0us_Z zFt)Jiy+7WaPkIx_XIk+hEK|j*6!dNWQpIOE^w}gCXN~S?? z;B)#SFdt)?KI>_0AH{}=b4&lb;^DpR`rj0f*%5O;Sb10mL+Rb-+W(|?NMyWq4o%4K z4W7LBVKEG8wapSa{M{BGqie?>XJhB~-T#x>_P&AU%6T^s0XOx1t1}A>wwd+zGDO>p zArVkA0GZzR;AD&P8IR#1`0>WX?Q^!?x0K2YqNxb~sd#<&Q~?*#Lhg{t;yxRUC-t7Y ze+pux;zo11NN!hoGG|oDByZm6bk5yMg3BX{j zhpT-~OYLDN!$&lv;bB4%jRc&2u8E*7##Nu1Kr3`J=hif6zP5Z3{lpS{+VLBw)q`+U z6~Wrel6x?qOBi=*=#@_Q@35>ARs=?*~gR&_fBWG+P9x&T6r+K zo@)3mV=r|)rqCeyLMB%`QW=#EV*I4sPw=%(ySm4r^*$n!cz#De9M)HW4c*A0mp_jC zkCZ}sLz!q8`1!vMXcAV#HrtXqW?s|G-)t`i6%-cf+HrIuKV?#c8P?R=4gcv}wOdPq zKY{82I`#5-FQ+;X6kQr9eS#^O#0mPEok5fDs~{7W@|>hBSBmZsf!logTq)IfunQrmVM+5;L=bwNJV+hEtb|L5uq$l96)$LHoDx0D2F6REpXfd7f_>t2 zsl1W!2>ynPOPn1!oR;E{#sG($A*jDo14LxK?Y`(`?CmI15kT)}p^t%E|bL@%(Gv(ko1!EivQcjecGB0~**a!H3d=^-MXaZ=ss_IWXQhsLioxvGTjpaO+u zc1hU%tanf|Eheg&wjw1|m9)9q_t@^o3R6I6KQ&VQE)k|C=qvjA5#2|+mYkzXb@wmS zlWAr3%~evHBM$%nVDBxXs$AcGQ9vZ6OB$pRBqe0hAT1>bill&aDIqWg0qO3Rl2Azz zRHQqkR6tM~6hWCFNKExyk87>{uK#}b9^-sDW1KV2{^A%6CzJcB`?;=PUCHmiH1od7 z*_t*);J^~<4~Rl+@qDsr@KczgGNt$hqZUgv5}8P%T=bM|s*ME_i4@ z>?w6|H!G2CBOoN>fiWD%4fSXV6WRf*AaKg*y{Ro^%q29Qp&nO3)H!n>1HZWiX4fe) z9p2x}kMP`C4z(f0**{-G(fN*2fP3MLHa~gS0eIuQ$>Q1H~TJ@>FzMk2duNs ze!CZcTw!@@yMu66!TBldlao85PAm3CMX7aAs>wZ?)^Z9+N&F23i)a7i8)^K9@vak0 zAiILrRRw8XHJz)CCsgIHbf?^IIUtLy;rH6t?q>%RiD`Y|JIJM=p~S{ZAr-9#o}r3r z5=RD5N^)CIQ`4R8M@gi%?S2zWW%P!roz&~5IQCgw#4s&I;al|<2c#!eF=Z-H+Nb%J z;pkdiO~dw{JTb$GbUff&pjO0f(3EwRQqeQ&`lx&SmD}lD{cShcPD$6RqNp9A0^pn= z_35$`hg1tv)e_KP$)Zt9I{R{(RPXHiN+m^6NdJ|Nsc$?0Zi&17#_1MCy2JlEVQ zOqcuO$BQEfekU|1%mDa@$%5e^H@aV7M=HHH!J>y^y|(S-e3`3iNEBCOR3W5t3@4{A zkSC_hFE|tx2&#s-#J@Uz6Rwm;c^WbdnZZ$(r>h+=Os!a1B>p@4Q&EAUua=B4_I{U9 znoQtQc}r3U>11ngpx>vWNG2R2R@8Y~jt9v;UA$v9vFtItL6{y~jbWvKv;Yhy2}8eJ zSGWTLZ!F+;`o;*h0I#~3WIn)exWhbCs$*?!X?kZW-IBU2)AK{y=T)gf;LKLSt`5E) z&r}&CdLqh-VJ2@gT-u~Vap1?txDXMj^z|mNx9L_3wo;Je~*{$U} zorL;41?LO;?PLgaDxa4KR7-Q^S6z=mtKtcYqH7`CQTf?wpMZDOVSkz%$%A>wZrIM}HKMJjLk8kD@Dw1ui)Npb%A}96b$vN}WcrMDOPCT(eBo62a7CkEdG+g; ziAygmoS;A%IJh7(EZ=_4$mz!W42eJU5zPB7?(zhsLb&BG$YO}<`N_;+G2t3He=I$6 z`lkDDP{?Xr37hKxkp6oaJ9)>S1F97ecsoyd!S&u?aau7EAXQE>I6OhLZP@x+2fHi# zQYvQDolRgN&WK<)J$d3-td3y=ehXhFM> z#F%PGk$D#2#*%a8?UUl^A4482YaGnp8cNu;1oNEHqysI9mkR3-MNSqf@q8DBN5HF7 zmL;!*sfVHsvO(%cZZJ!^nmrR4PZKZ}D*p`Vvk&4FB?+XE|DL3Gf`a@vBL1ZTjPkHN z!0o0hL9E6)0-hiZaJrzzKS(*J+V*r3mwL%l*`9NVwmNg506e-mdYKm9(Ya!F_wxe* z_{}0Ds9P4#fX+M5#;V@HyQkF{Z03oMQiAQCjfjdG|%2AUef# zjVVCdV=FQG{F4r+{sOgk4s7lGi!9`?4da(0=MgPJ$|sP2Uw2rGqT(8sP^FWT@(hNC z)&imrT`9O)DEyahx+=tKIKHVcbkW0rK}(t{+@N?-tB4(+ydVQe`yr{?V8k5V!(ina zU=c3h&=5)a97LVz5$}+8h@66Ui3cH1pr6cidk|Z(!&Ej%sQ*)!Mj4q zqqJ`o^um8|k`rSdRUIx$SGnjf(I zG;5+u=+-ar<7;DA0^)fWB|m6rSqnh=@3xLRMSu(_r0a~90C2w*e7xVt!huqhl=8}# z_9$50w74~{Zcp&@c>edZBpH0wo?f(O8jlrpsnNtoxnRi+K!X^NZ&rkOydEHe<7gaC zmV{Ty;xqpk;AjY@!yQZi3xOx$TnOj{0Dd`wVkwcOlpm!yJTl}q*xkyG-fg>c%i#@N zkqXABsRL?7%n}#1ODEQ7L63WpIs76ey&)9nKQh3}TzP0rQEEH~DTi-|Tg*t0VezZWu=+9)VJ5mb~6a;XQ!j9X{sICgPcOR>bZEO99|ds?&8swPb>MUJ)eE z4fFrP{57Kf6Z2n}i~gqE%2)GZL-30SB<}1p7O<(jAzHiu_JX0K9ZH99r67oz6}DtBVhMkN7=$!U-w;wMi)t`j4P$|obaSB7mKTz7(JNYo--Sa?we4-N zCvOJEh)NwT`@Jrs_2muZuWmmC8BkpiHwm670b7nPBKS}ti(*w{5h<8{knzon)_qwAGSiWMgp9V z#gX5*cJPTgclQsALU03dsH8M(@LQ)^7{r1S4Xbl9rM_#hTb^vH+O$Dgj-3KKH9m!9 zF$8v)H|I|MA+K5;KWB>15m9U|ml>N0Us>eB(9lba$1nf*75`c#o`n}mTbp9m$vSvs zw!0}PZio!W6Druabw>mGmGl$<=ogQL1Um_F(_#;lT`4U!_PF-NIm5|DhX9)U`VoZq zU^6W-s88?B)!LWi6dI+uK&>eD%G%D^H0y_>j4@6L!s| z>|li9`K^LXZA_}u`e$9qUN^o?1mX-6ZKFkDj4kI3sG>(0W(qq4?fP;@)6ZVXctr-0 z*`Ak{BCihy$mM8Zw;j^ZJm`tTRr>wMoh^x-1-ZS(W|yg}LxUm`QHomDO`^+nr#m!u>?YadbL=TEgO_e zQQ3}u+ZHHA9ccoFnk5qiq5|Hk2%J@)<0HH(M@->yz}dni=!tg~Qp zS*km0C2ueBO}?JQiIGt`K&qLPO9Id1$~oO(buNAn^E-DxWXq8+MUH&0xEW5Vgf-ZT zuTr&SysWLyr5%t;C{4sk?O)lwR&KZ@Of*Vim#n7yR(4aZ#ehB|k6V$|r=H}5>lGKN+6*}hgDt`-M5_4DC411c9iGXI+wJxc_a_+|{98w4u;&0M zx9~Md8gXz7>D$i{GgDB|`O%-VxcM7ZV+fa#cc!%}zms$(TMn28{e=08{nw_duaBsf zXUO3lO^p5v>spX5^sM4{)GTW(oyj|ENyN^S%n>2^p)KM8!*8D+53DT7WGDPtiU%MP z65m2?tXNLwa1NdlMG_L+;c1JyUyj#r4YTfF znr3!;YG~-YcIhu+&vq|WvF2&!m&L!qYiu*mUU^#I>S)I4JC|#V`i;YrJSW8t(0*S9;AB*{teV^aOd81>Gl|l;(ginCb|&rT2;E2w#(|) zO|ITr;H=;3rz!41p44fY#sjVWtrXoaIzM$3iENhFw*o4c^M+q`wY^=MQZ(&RpdLMj zh&pEzo{$#P){Ss8KBOX)bmRcYB}?gfr-tn#}rn z8|Fd9dBcb*|1ESXJYs3`S0YXOpg zI&89C^n2(Ps1=`!r?f2J{>_`%V0%>vW2}3NW}>N;mRjX3+@=9(h^1u?8UG^3yt)H z=(7^_5bzVKhJ3#G)8LF5CRgG{Kz_(}k>LWzFfY1GO%7Yv?QxLR7oY|gqk(G{L2XXq z-D&2%U)6Got}UP=V^YhIm_1JDB>Ee$U`;`X-c#lJg?av3T^(iZ9!&luF68hc7L<_8D|ztCX~$!F=R0Q(yKH9DG9AEzm%IMKnDPj-$_ZkzA>xAK$(~ zaEBvlBBQi>-kjGdq!2_M`~mU}b%;Y34;(D*R=p z6*@pzu)X`yn*sS@`P+!{9SQk-1)B7)pw+&mlX*^9E)fmEXVzxmIZX8Zy^~)HlR4xb z7OzKY-vQdUiTGSAGxjMG@b&e2%Pk~yN;Q)F_FSQ5S8Fnt#`_`CwP}!oHo-T}${;xl zT?gcyuMxr(u^E1a1kZ-&0rL{T=Dz%++JE;r`xq?aa|f8^KjvdF>4_-vn%;@~I^R;H zvlk~~78sZ0&z_N&#AOSP_F--9qyA4se z^lreZCkAd*md}Bh;_JB=pUyOmUu1qRVEk}eCW`kx!U!Xp^x4b}h%#$ztNVnZ_q5sF zh-W}xuIJOs_2=;y-HE*PWoQG3tByp%=Utb|y_S33ftB+8=9O6Y$x-=kH|J z5}+o{*~x4{Z!6?r_Fy|BTN(pa80XjhTxhce7Vmz}wVrGUADsnQXc%%7-^0D_rb{ml z5U=BmZM1Z26bF9Fl>fDnT>Dk*ims~dC8Yy{g%Fm)iU^7abl$%mXcR4ev;-|gbk*Ar z39b@-Bl^MqaeUAlO)2dkkh@4Nd0+yz5l zZ-4V}eUZ>dSf{4i9Sq^FUxBy&Zs$IrI8i|&;=6oXywlpmjj*ZAKuwi{h zYB5fG;j2$YlRK6o$7s7Lz#2#;EhOc?tTTOTkw0I~PpYC4@Aiy+ruk_W4|ntSq{xNx zfF(kkupgfxOSzG<5T5?4is6d^OOYqj){BVFmUqEYCfR|MQsnu0hs zP|6)y*a+7SAhnsvS$f#b+Ai|7p9}UU@lJ?!`;p&^>6KT_`V1|q)oMiOAILo-bx~`n zN3)u&XtL6n?+Rc6FCzmm_b35{P%*y})d9Y%oaQIfL?wGICaa37Z!oON%P*rTJCJnX z-i70PW6dg6Z`6PO%scz~LTfX~i)b0F_RfLBESiIIuWPR~^-_J(d3p^Zk`~m;?ii&a z5~1~q?lm`BCZlH=%PXDEV>p+ghovOxRkSq2{yP3f|3X{6duJ)~ z*MNLg6(_nMSIvKMuVZLMdL>?gN**SFr3TmdvpJwNU{GJrRq*NG=}T)O#MQ`RS-$e_ z;Nuc1q3fDn6uTl-47K9tqjOQ-QlMNdu0iCCnq+tpLIwA5LdV4D&qSp!c12#JmM!z~ zp;BzoLEcz3l-b)so*ui@VcVum5d{9Si_z>~>AG=0 zUat|wQ77C!y?DDgee{s?RHEnw%lijzw3-|meRAs_caL*dMNQTYE48tdRee84evruO zNv>&hoczTKS)Lh$y)ta3;p!=h+?eG|0oF`15UaToefB{plMo7g5_8nyr;k&dLQIro zmtE|<7JG(|G1#P3)fBJ31Xd)EZw`#TU%$2~gO%84}^4mo*2gw(9xm?Qjnj7HJl$?SU}U|gmj;(PtS}b(E&jsC0(O0j;#a3t*h*A<#sRlF(iAlCsm)FE};iagv9jX$^cqdWX8$OfS zW?sdTvgTqb@P$5x$vjgzurEr$X+MrJD;nzuN9mBa89#4l=dW;@OSKk^_>{J|6mEz2 ze-IgV#S(h&^(Pj|;F5hi+vcN~B%vm-g#@dUa4g^!Zvi%K${C->7L#DWDr{WoqO$TS z(t^9@)NNk(+I&h$@7RjXDA5jMbzHhu4@$|W@Gy-&uc15P!}BW=!he z#KWfJGBHnzF9wH7qrhocw{Y>c%7K5G?M!rD{@{#B{zUx@tZ;@>dw(4)8^8G7m6F4n z1A|)3qvz)i^xlszNjt^SO<98Jcj?i`2&FTW9EKS^BxQzwk{`~BXx}?)$v9YF|3e2v z32w?=t>ThZbc^Gh1Fg1Pi}e4n3xcuZ)5iC^t@eW+=sxB{*UzY$u@#wF-effi*;eAT z{DZ-H7|W}rPfa_qayD6a+|W-_FjKI_*hd@))7KAd zURmPHZW(aqq~yn2*-wfDfSdX3K#cT5kNMV&6XENTy_PhtH#J_rR%f_=S?X8Y@1Gu| z(W;`CUDJ435d+o)C-0}k`iK6YspO17>FWewQb*VZA3wV}-udyI9nIqTP3h3)LBw;x zA3oOXWw&e1`Mv*88C%Eo0;L#g=^nkQ8(Y5lG}*Xsh`8!SU8HVG&Ve5Fwdb>fXrDfz z5l2mIY4-IIJ)#4(ke|$JqlF$ePMh_5fW@EbyVecwMLJ$|cIy89f({TeEwL6-&xqcq z_|KEBm@hOH)UvuuF_}NG)-HeWZ`()E0%atsnF#c@ ztEM6kM}S-+*AjolSlivZv##5a6E#GTA6y;zNF<9oFzMh)&Wln~_782*uY`k{tB}J`N!bc2Ghk9P9dTHVc8n3_Q^dD+%x^%aNtXk)M#rR79Lr*WK z%VP157U0GHJ`?A6s1fZ6^_Th>E@~-g#+DDxaIK`}HJ9G`^B8l_=g+t?w9SYKmT^Jc zTeRB{M?u({%lO~J#MCwT-_ey5A<&IQ7cB5>Rp6D2MFN*?iv4A z0RL1s&7!K;iI(SBojWvbT8^R(Kar6ZYZv6A3;##Hnl|NF*ZB{b5eL^(t#&s1F(v() zOmO3!h&35i{ul9n!4lD{K=hgSR0zHP?=qIfUGT48v$VbnA0|yrA65O|e^^7dGxB0+ znB;j(E)wh>d!Q%X_WbpwCB7@&w^|TC4_K;Ks&R!2Ce8*mXZ3iz@NmN9x}$ya^Skw{ zqdxmXrE^9ZNrJx(Nm}OIb}j~-ICv1gcg~#S&kp!BAPA+>2;*$Zgkdy=M|A^~qI6=c zf0F!?*5Ru|jVw`^r9}W-8|B+4-fL&iKlQ$fwp?nWHQQIzh-Uw7_F40f0wo=JiGGbO zxqPVpodZ1~6x8gklRkfIzVUZ{{(&&v!=EF@OMUE@E&$epOj*H|x0nou@T4|mxXRY5 zstFRTP?ob`v?BdB+%zliK$z!Q!>Gv;pWMX@Dt~^34u0j2#!@@pDx4zyLqA6A<#zHq z-+0qQk!78&UwbFDiP<3`uye&_1C&hoks)l=9X5=81=`W`Ml=Aod9^IxYZRD2ZUPNX zH7NP3pfdKV9E=2M$Un9}cFG1#kB>k?n z9&McUgW0VwkVH9!|A@IlO0DNbs*x`ceqgvYNR%k!)k0wE0Wq8L9^?lq5uZu=*42n# zq`i`+6JaIz;uU-+&oTycuGeT$I$7EZ=c41XA0(&U2Fl+X9@2Bn@tHUv6VH^}s3@6( z7ySZT@OQ%>AhbtvhetCHoFJd!7=+7nxP&a$osKZL8-YQ@Fkv{1DF5xNKRM8pSCMQb zNM#*ChVXoVQ{;xn|Cc_2xBy8&!lzl6hV*u%JC-7_oP$sI^eRACHiw96_BqB{@>-GR z5*oNsP+Jdx{$*e!Uru^C3wMm#oB@n!&dE-<01eA-hr^mV%MGp2{vOX z_{)_!>W?#!LATrDzXb+91lT!Wq|_zh4WoRsPOFS9j4ZChG$8jgxHevpOZ6w}4W$@W z2*U00*ZJU2_%cxzn+r|32c|0^&*$&SHRJa6<$(6^1|hjf%oK~?p;OBtLu~3uUIrLB zZk;uKTsw+HS5&{+zbbuu<1!MN_a}XC1Y*M!UP5}^@CixJh4wf*-ora72U_BR_19tV zndW%VW9(YNAH(Ui&VcMEAKiCr-dufuD12Vw>}zS}HV_GeX=4t_)SyQKsQx7EgOCyC z;(+7(pSd`s*SOM#Ndr~=v4A;1kLpXG@D6muavy8f9b<)`c_I$*09!-?Ek4sVjl||g zpRNf8P2JaNyTsf65zS4ASYn^?C!#+&>LZ27z=ry<7XT1Us#n578VV zdR{^@EvoJM625}_WI)CtrA8pSkh_6z7H+2~GQ6v(p8GMyr&AozR0`pr4JKY(zLs++ zY;x&m6#KWVL6qXk=Qt#&s)v$hWmq>$v}ky@>p9rLq{qY7!-Lqa28>eJc=((AajqQ) zz>nai^hxP3uMmLQmo%4TI77?W9mybr+%m2IzGZG=XwP22lje=bY9C;Kh--1Rh0fy> ze-(vWJOJH4-tkvy@^=((uROq;_wj#ghGefqlY{b8j{{DFJNHAVAfu2ns%uForWUFw@%kNg=<$r0WeV3`fnJ4+4T zbqL@dDG8%I0{kt`d?$@R_Z7Hhn&Cp5M?JdoE_eHa;1s9-^tC8Vi+r?<^kkOSE7yN7 zbLH4G{w?gkrTcf0AG}^j;VoUcq8n(YttU%`4QB2_|#d$F} zEi#NRyE&h>YgUyO7RKHuw@@LVZ6oFstA{6G}IDRgnG zjp)-ay&rFpfp-5{0aW1sc}<&h=ffK}dU)kP^Wbst6W)Aytp`VpUc%BR*yP*+y%|kz zPAn87$w;YnV=PkKGvzRSdjK8Hojt$VFiEv^WlHIPxnQl;%oulIR;p17=G9M1cbJ#2 z@tQu2o;Mq(dM*a<17nU8e<^P7G(QaOsaj7`L-Pb-tx~ri@!~Iqw*#`^R$|z=fOzQs z>$TY3<3&7?_9HE|SEMs?iC|N&Q?YTFh&$d2lg$j#ozg86=%?NK?-}1=;k$`W!V#*5 z%GN8V^osP5S>FA5`<3i|Ko5MpaB{-tHw7-{kxmf`bP+Gu;Nz5dxEyedI2^srvD}#0 zZJWpd?W>OtRXMbgd$X;TJk2$dk+SE!!O%1?}4Qj}C8=5_=ZQ?hW%7U_~lsr_0tr~^6~)$_7_M)_-RIi&s8g1t@iTw6q9 zHCs$PNZO=22R5vh_{@U_uEMio8>7TYF%`4q*q_AtXMP}1Y@P@=Hqs1n5Y@1MxI@$C z4GfPrR0NGZHB$w_`{qC3)$;=CijR9+vr{Saeeujce%JZ2jTzC-PAO8G6yu*z=Hb5= zLX?umjdz9!Pa$Q8`%vv32fyLHl~N-92Pw)*lw!C9X%+a3MGv@XD1teNhC))fgI%VM z9e$k{&i`CcnO$8y^XlF8!TgOXAN0#3({Gg<&H>!5%V?6Ji_NK~2C%X;Op|n7pyb7#c!t)>9B_6}^553OB zC%PA(;r;wbQSO~)@C=~}@ffyNF$sq_DTDwIbE>*%tsGt-JKZ$;73S#>xTvmf`rO+- z8_F#d?DO>jyAB;A-|n3xEd_^keekib$r><~sm1EC+TaFy6aNd|glQeJo(myIEWH)} zn57A*@MfO5AaA)=4^=D_GU+fAupi8Ayg*A{b_1qJmD1`H)uThN z34(&_%8wxk=Q1zFLvmSUev%+Q-)$tCN{|ml8ut61UTe@{sqfZ%v9qj+tzyzlYie2V z;Z=E0Lg7LY$w;C@UayJc;GPRh7A;xS8lQTE<9lu;ygS6*63qm|6b_Eaj6x@<-#2F( z_)c@6{Z{&^K2OzHZTkVt3QQEA-Pmt+)bV@=~&hKlQ z_v+xl-Cw)xPQdz#t3e%1Q2=PtHRyasPPTPL*5$C5yCFHcNS^VdY~j-iS@c<_S;jZ` zjY^|}05b1r@q7(f*;#myj2~`%|2!#1%nk=~UURvGG`HlA?%0&!10h-(+zn3Px|nX$JZOCpee_ZxhyCuCzE4^q_@_82M;DlmhDV_o;|9&(Mp=5O z9n`SS57(e4Apdpl?k}vf@jW=Os`(xlbZv_(4CM3%$1Xu;md!GbYcu8aEzU9jKdb0x zXi&_0k^}ly@!OFU?4~0ck4}ur+uVN?bhy*8diNv=t-Z4+&H+ z-NPILU-i~ol`Wccp{zA}Agb{`^@G+;iX!}*=xKJ%5PVIg6QTYDQwF;}Fbn0;^^yDJ ztX019U7_pVqQ{{>zARj9*3A}oHpUY&?s}X=zMIOUL*KZFD@EG=knp+pY6{HKJPX-= zi`M<(4#O4iRak&gzw&Z?vEAJhmxi9${;8DbxsC2kf{brA>o0&D=3ge94C~Tjh2HgH z-i6!RP~R5WcHJiwjYZFGbJUiwKYO~CEQ5!!Xp4@GIsfI1Qt<8MrzLDT>~gnm(8CpF zqlt3#eC7YhMd*509HA6@dxE2ksLwb|jcs(9foO-fLcP$8+%xZ!+YO7^wxEimD3I@L zP=LchNSk{57HI6+l~)hP z;A?UW;L9}gGWw_F>O5ipi09XsG|I>D_ozv9sIPG+}DfieNd5j`#P*9FG?h;j*uV8$DsBDf*hd6Mi8DfR z3|l%5@lD?L4igE3t}30h*6Hyra6m7_CHCFn)3!>SwB7w(h_h#Z<-ws1JDd&<+z~i? z&IHb8x1+~0d;3_DX^LuOXT+#seM)dt@I))& zr=m?3KfRk0l%eNV4Hl*}v?H0@(&N%KRfqlR1$^uKC$HRt>z;Rju1*k!pw%(w>DNy_ zsnMUflr386F{ru4ZUIAmf{w7n0!Kx z&LZ^oCl`0$xVWQw3eW#`LVF&GNJ+Qz66RsVbfA0k63$jWbk|sBSfsY?jWp*QouvIko68nwj$~2d*5^g3Ttp28X~fjJ%h30N>Do z?Ryn83{*5A=cpRamDXp2Kn#29iwP_OFh#oY>CJH!&t1ToxGSyNS`i9-!#)9kpmg|8 z6Oc+g9BlHKw|rM)B?4L~q{Wbx0h1&>dSMPlM8;u8%@TTKmYhc`nB)*YWjmlX1wcx5nM2jo)cB1q^`pj>|xE}CU)(8X~Cv0xR-?(mBn z62l7%jxYyea1IMviHTQ%etYH_Lgp)wSD6G6p+f*vtN@}nsJYnAkr2x4@Ci=pm0m>N zv(W&x&JdvYWuA+j-mB?X9x{$X2VkNLUd}Y==Bs?bSzP510@xE(-H6$;EZlsTlVzJP zs;_*(bN^n3!4$r6|E}lji!>BR_XNIwGGX ziOczJ8mz4Y21^;oe40j-yahB@1HDUC@~L~b(}_r3IF)uwPI8^)#Jx+yf2BI_YJoAl z53SD_mtRT;h_Axq7YV&k1;HRlYc*j~-kYWw2oW&0hqMv9^Ce*&`%5Rn1a&FnsL4+~ ztSC3Dvz>r3oB{?9Ld3;F?LcHaC}U&FZ-g?-i1gq;q4NdI?p#@+_p)Pqyc>#zn%=w+XHCnXm7PtfP9mBSN zFpI22baYPGV-*YRAag37f#24B@ck zO~St)IGSLmAnc<$n&4N1*5N_NMAUjAnZq{qc!p2c?H zM5|YKvY6e)z4$W)GaXlV+A&ZFR`Ga=iZZaDHmj><0iTzV5Z$vP-w zy1K0Ji$8y{ml9PJ<+LA6i@u4jy-XG?l6Tm#BNOyIoX71TH(@$b>rCSDxuvoxD5DE6bnEr za(QTC+d!Cn^E*K*jlbDT;Ascjt({mL9Jk{r6Tm`qNxmek?6k~8xxNUP11}HF06fcR z!u~F6xqX<5KwBs`Y@lOT5z?@X3$Oc(oOh-t8pT@I#?w;h(iUit2)$~L$MucwdhK=d z>=P-jV0wXqo4E=cX!7cF7xE}#FHSN*BT%mTU776{7p0z+h{S{qdfSg~jYTKR%K~Q8 zZg|K!EU7x8t-Wirm91&;h4Q=R?_gi`go-?@y>-sBT^AWj#SyD6{ZWG~0hFwjwYstRbJXoVG7xcSC}KDF(y!)4a@Py@7GpxWpVqaf zhM!ssbOYN_l+nM~9!IWA;owor%$)J`q!ibu>ADgogF07o9r4;c@-HJ^3(6Lc?c2ap z{I)4cRAoAyNaHGILBh2oX4l%k_QM8@m3iac)J|0i+j?|wYM6_p%CBE2VJI;@7YLFg z?-FMP{oD{$^j{-vNIAF`Z(-xU?Z>9Gy4^%GiUDCc>A4_c0@d*A=Kv5`UGOP1_)!$e zW^{KR^Mg@BN%Zo;Y~lwgJq6u&Q#ah7^--(8v6EW7vKT^^q~I&)QCm}I35L?U-62L_BY<@Y`uu!DMoE_w13H5>q{sY7RsZ1 zaOkBHZI6`T93)VJ&wNnF`@2@3E|adYdilLYhIzxKsnxxq z?Fz9ivd{D<$Kopf^JClLI2lYfa;9wD3v{?l>^1#-t=B)Y@DsT0yGvN4tO*@WV*aBxt=2UKc8gKz!8;h$U8nUoThifN&!eSedTEc7_`|iu&7MOc7jj6;k##S|H<28OC-CLDqa4SP3eQs2CC;GC(1U&MD;XbTEczf1f()wr68z)b(t`zaP!q_eT&m zX8<4@51?wK_nHBGx-n6zWdyG0LnwUhfg`Mk#D4o5d2FI6XgjW~6AbImw+635y_*Rc z4`xt+@qnWs6%67!mJm^12_49hv_e=YqpWwS1q@Q3fO(wJwEE9nXD%P^Z_N$?LswFKAlW*jnv*SS`A@hy0N6&;vXjWdQAnLu$D7 zD;P180z)4O^++8qijtm?z)uy2(eQio0452h;@BC&40BmDwz=xW+7eXDDFDwBzo*D5 zgcum3`((_#u?!-ntM0G%Ogm1EgWB@p@H-fyBn;Tyl|uUgP0Ud?16H<@7C2nEzstSv6TBa|Kc)z$Q-8}akP2(;og&e*Az)<1g{Dt{779yK9v&n`0xiJ3mXdveWFz#Jm_Rsml$)*0QV5mf|Ta|9N;FB1piwUwo1;5AJf)SwS) zTWQe5JlMiJNy1M zFG~`jx6Vr{qD>OKQgMh+tA|MIUmPfsKfUpYwbGEz$f{&zj7|6IQRi?PzoCkJWa_!= z7aC6qS>Lk0BT5ryZwocNkps?sT;3CXU;;S@p($x_UtIbb{+bB}|0&DsNI-bd`7mlx zMVP>m46PJ@L*3oqzjSuGQ_iFAo|yE);7X*MqCiWM4B%K*nTMzp=u38!KY&#_s`~h?D+>3<%LaO0aPox@7Ug~&=uO35dC~*<`C!(wV)V#_##gXmJv@{>kbESO-NbGfZj)ZB zD5+*92GJAV>LEujI#*wIzM1k%c}^me)4Di33N7o~UAY611PJ^i$_OtKA|GCQY*we@ z#v78I3b)FmdAnZxb^L;w(8Kmi?xMUfpwU!9Jd3I`j|n5Cn+eqSEmebbX}? zT|2UAJ>Jh?q8IOozqR)^$_Ok+Zvv()eByIXc1kFkITMyd*awELC)ZA1gX!IGd@hPA z`~M=;`Qf=R!@WrznZH~t=E-wUIl>8jiaM+au(X3rrKcTl+p@*H0SEH^abg4ZsQVI% zbb^-+?w`yhwr-Lh?jO#Vy8_|WCDx0-ZB82yylfvSkeA!^ZXC1skf9jGK_+lIKU@WT z#<)RbI%EONFG-NDqW3mp)p>f2>3%sN1vN{j#r?354Wq@Pt>QMacI6+Y}=)#=n(VBJ1!Srvz;F{A8~E+ ztqudLEzS6CG7`k8_V`!$XyvgIUR1VBj{~fFZ&0Nce+ZZn)ISFsYQZGI20joZLHa#zLV|a)`mX zkP8)GZ6d(U$C6|tQAb8rFNvq~S)qR2yPeBAl6cKlNFRY^ZHPQQ8(&^Cu-b5u#(mka zy!SsHKPw{`#QlG}Yr#g99VUtmkfpoDfhI?1UN+32)@ah$8{_%g*RGOII* zovs$$<$_j{1X@Y0j!ko}H&YVdwVb9sjwZ0pU+B@3Q`dckwlZ-3mm3TYCc|I+ot3ljjhiw0?-vw-e` z1918zz+la7@?f+C?KulG1nLD{u<@D`bP^MdE?4#fp#Hl71*JGl)w1_L*M{{DfT5xG zAY*_)z%ezg8)K0*QgWZ<^`gkA~fy5(-BDkU)Oh&JvdJ{d#@JCf)RCQTE zHgNy(nOgfH`T&p$r-!+s;0#|a3FbdV?vz?|oM5;8@#Hn&LV1WVDkq1GG?bRwi&$01{uG}mAP;dU`8sX3s3~?7i zrgb3{NQ@uA#VgQeZV>)%a~x#@JxU;G|Jp7W+FdLM@H8`v-8HBdRPrVSTkjrS(a&Em z?}GJ5KVi3n^_MuuA?ufc^~a~GxhTE4a`w`)AUt5>!}?G^zqwE7(So`E{yUD`OAy>% zhcsty=x)>E7$pWl7V;qD6@cYB5Sx4!VCf7{188BEdfpNcg_2PiXuv>cZs6v2z|vJo zM!W5rTu9#b`3v7ObX@vcU*iA8-g^gCnQz;of<(z68Hti4gJdL#5+oy8B-y+l(57%KYI5$`<#1s)qQ{5s#EXns;=s$devIr_lt9m zImVb(LUyoNR^a9q)g*s{p=16;BL4A++mVup+!@m*7h~Ii8yWmh#6*q2Eiju1g4)#O z#CU=o7t)jX3v;#348C_2jYrO4=O1?V;Y*OL=PKa_o?o! z7_QNX1Gz^Bu(;Czu%gDdL`h#IP#}%XBFJ-N%r(`Z4ofl6y3p>M^PQxP*jwP$W z_9C~u_xk+){uzJroRT(()VA-q3|T|$!bs4u4qFi5wj54rZ*?Am(=bVXFU9Go%o9FX zSuN`Y0NHD$VDbK0Z8~GJeNkO1R|Oq&SFZT#s3SV=SbK#DG%6yW2=cM%Yp_=|oXoNb z_DkD*DQcyq&Dwppw#1~fnV$C;Xmd2c11W*ENV zA)E?B`=?=+SF?TTB&}851nCpN@3dWdDAM ze~-lfuhxXzybL&B*m|Cz{fK5hm_J~GOocL#R@Xd`SED-mD7zx&t`Kb2{(L^zYDU+X zlft%cYF%Lmz%2s+7o6xP#`Q`dBIQA9Z0(PY>WaXrOg)BLfFDHHDbQbT7%rMszyUY+ z09UGdhWLF!@m&qtnO_86kSCM`2Ov?r!0iF|_7DIRHJd6K{CNRzAt0q~@a{98JVdY) zXp1ongoYBhOOm;7a%6!irIUa=cu4Q-Pze8c0Om9jxsTL`WLKg5UrJ@~pUqoa^@RibH6Gk(kV5$PeU+gpq7f z9tU3FHSvH!YB~fs*Th_=AB~X3^#RRu6?hN{SSYBwr`ByQw6|vq(Fxl`*^K2HgZq5d zm~yV5BEl$u@3}Eibln!paiBCv8~_GXDM(8Zu+>y03O5iLA z(1nYxbf_a0dIOnF89z0ZgjbHT8PC5xB?P_Bk)TK~4-7B0IksR#eN&ZrACOnN@$T+0 zv|?4%nB|vEDFtfW?D>Fl2x?gye+Q>KFU!M$PSNbckmyqqn+v{Oc-I9WoMix&mfLHx z&bmLdq8-G_K+>QR-6H=gp9}2UhoFzTj$p_!BL#Biy%EMNJr9ABN~ydEz8*{v`0+mj zd!GHrNDyHzO)QzeZ!Qr>AR+>=3H>C4i?>^Lh~wQK=nbif9zJ%lZGPIDbixtE?qAH&rDtuVGv` z8t6$B!|%6dD{J1L%bb!OO*Hlwq=Rd|fLvvDk!}oKefyOGpDTgP-dPtxa>T|S7KJkG zj50gL+7@2-j)uh-g+RsVQiyg(*`Ka*BOx? zv5<@ZZs^FE5CpCL6-Ez{d-e^-!-1R?m_D9jjGJL+)jBQcz!~hqWjP2)(}2doL&L1z z1-5~gz!T)PT@e4Bvmy$D76|vz6@bK5i?8rR z$k#tNf?m7}mafU5m#OkU`@*Ws9>_u8p-?ddwl^0MJnzMC2blqgu<;&meXRInN4fl(JqjbE$L81!aa~R|xPu;?uo< zY}Fex2*nL%IA?T~&b}(q$d@suy-4$*gKT_+B>(*(xQ0%aodasPE>1PjkcS>(+xc4r z)mmcsx_7VRWfpdRmmU!d1eUJTN+?oH_#zW|#G#p6;ahnR;`UGuer=q30~F&Y^FK!! z2uWxy=wQcER5~2OJ^`^S9qYsZS{n|p*7BGZCBVp6WE$6aVNSl6!03<0|e3uZKfspVyh^A^I;DbTPnj6S^)TAi{schlNk6I2W}rUCfvYzRP^O2E`A z>_tCHhL%-4-4C+zfV?^crb$yuI3Z7-ogLoWxtEy%WrL~%q~Jk$Hh-`4sS8q&0gHH^ zvxbmoeFg&a52%>Z(z(nBe_R!`#-_mSejuZ5zsPl~sajZe+JJui$YPK|J^$_PEvwJz z(UaooC{%(O=A@y3)?26IwleNzSDF8kWFEEKx>2_$4v_mjIGQc8IgqIk*l)}^Q%}GS zRJM~-)*v0;!Qpx(EF*rKNMS1#g2Q<1gLI3_KV-4jm`nQ**<26&zmMkqkAM{a{Sg175Z-@J$N#PAK+Sr) z{LKY`i}I9I@&5{Z|M%4V-tfgr#vfesIEfZuIVg^2K=kgTQiU2RcU@wD`i>GJWY? z*#a5WcMuV%0?%{}(pbZN8E~*jAbajKb>rpTZ~RF4di&!mLuh=$gRoPimkW9aWIY9+YBq1#;*rWO~lz#|~o_z1h z%lqvLi&Ck!%)6*1J(j2Y{G2IRMY(`2$5fq!EF9Y()c96ES30lBm{Zl<8avjr*fYkz|@ zeObz`ob#ftdAU$+t|ZiCMkYd&5JVvpFngxh4QB7ntux7qu@`j_n0p#>3{gmDZ*rUw zkq1ssE31DmrQyK+KgSET-biz1KY&N3>?_U=j|*B;3q$+moycS*lW1=On6=k~$q zG!-0J20@3wnxAMNB{=*8ay(#JhioM0_TcZ`tkSE@w2tEzB5TwWxchakE`Mx~7gR6S zS&!5s0g0yvB))YizuKVE?U~BGx0;J<+9ikSdVRGE~N-@BQ2kk1kLNq@cRYqe%k+N_e4d zFOr=g$n{63o93JJJQySE77-g@Ir0$T5mk^;Op08F|I%+4FsRN1<5XNHJ6w8#j^K`{ z4rXjIj8CA!o^2!=$F}qehxCnSFWlaKCzm(@HL3;s3`=dUHVe}irTEckKBCDIRhvS8 z5<3nm&l*C4^iM2bkp*xm!okB1ylI-3Fw(bf1DOq}PwmfZ2@PR1kdI+0%iujJvy9j$1%<(OYNKu+dpjTDUGG}7QjC%oF zZ;Ds!dPlnsKfrXM@z}L99l(zZvjnB2Hkmr5n8-keK!J%9BHd}+Vj!kz0%BlQsb5GI za}Rp_{>e?(wLtWNhq6bPjpbu7YEc_5xPQV8`S!BG`#N9#d}<09$jsW^i^vl;KLi@Y zm#<`hlbKMzXP?x3*#6H~SRDBq;eRoDWED{ghCO81J;Q2mXLZJK)?DAc#|cc%J3FfN zEV}**d?63)_(t7#7P|ijU-<8m!QVssKXW9`hx|8U=>T}sas!C#d956}aK3@|I>=ex z0^S2}9vccEk7i?4-=jz?bYU7*09b|*sB<;zq z=R-g|-U*oHZU6BHK7Q^xCyS9WH~v9l2Utb(fQvyoJ_Uyg zi1XF}h|U0DbO>mPtQ=m*)mEaKQUbj@zQfZD!!?(hqoruc(&sOay27rfVZX{MxXx=6&WF2DToU}IS#7+9tIM-Jc|HmUs!z= zko#BL^R2hefnNcqR({+iF5LGOQ31DukB&^*DmrgMasRJBWWRL2MLQ@Dom1_&j|Ip# zCwN^X>j9iig9f0~7NRO)>pntJo_c6S41=417##oug6mY?Ma^e&5h6H4J3L%FHSH$Q zb&<&_&Y%zXh9N9N3J1`;u>fmSs{vKZTLVHqPmugi*}+mO0bBKaveL9tw=@+a#4$7}>Idyu z-j#bzRrldoe+I0DM=-J^>U8SkAcNxq8AzS5i6AH7naNQ3?_tnFipvmoI(?>(GY2Px z$q`)uS64yc8+GZ@|HIwwC~5a1@kLs!?TzeXhrN&At0^T@B@7~ znYt$kvA%r1VEwn#2AjeURgtO-HS|k-v@&SJLV0#BzQnQ z2@9=sW_<&aG;vv%7HckxH)ztDU3nrB(htqn1m5V3$lF*bFPDsbYJ0{13R=tGpa>px zoG5xAY%eI=OnU-)&r&d}$vv!VwqIPw|JD{N)KB7FPWDXMeV*Y%v2C;Zf72AHNMbrd z5DSE8<5Sva_-5=0si4B;tG=Jcw%!w8csmq&^j{*VkW}Wyo}KW}QyztinmHYdwD-oo zb7aD0a2l=P0j|aEi^e3t68VOYMW_WCPpDc>Z3&-uL}b|GZ?*~C7@Xq$m#+#HiY{N| zJfb7x3X6(9vmcM2)5tl2Hsax<04|yPRc6NS?kpzG@Go2|VEUyrVE*#e)O+(8ArtTq zAiWX19{D>2Bvxy9pM;@)Q2Ewp`GsE*nQ(hSPjSuRjL_BpbQyT)iFK8Tq^Y9Mw->za zQ<_|3C7WkImU@3yW3#c7n<%Zx0$0#~`ZzfjxhqOyFNOT03VT*m4ksOp*O3WK5?%4GR>4ojb452W|9{njMdkpX?{^)ql+sxNJ5`w|(^T`Xx zw)s9v5wDGYmQ(G9o~gru&snq{B4$tCU+0Wr2Q$01|87D`KV$h<==Bf(MO3A`VG9Lm z$TbAOJtz&-q64u1ZGq9=2`SSyx9f){eOGXeF+jiwq>OVJbPHwbS)K|X?*00jCjGTp z5lT~>(A8s#-2>LqjmCDU4|D5Pyv8oLyFIM~SJy=f4)up{A>Q7ZK~j9EX~s_5>EZE$ zy$IP(@e=UYE9z0NtIhA^JA_+pF$7JBH*KS+_HCJJ`_PNmA0RjcJO#EFL`VNc5Hv+V z2#pgiAzd5v)VG>FGyEMn)jf_Z{4bBExZn>R(0x zRpn>}sS(1P>i7n8#~Gd1yHbWm?OkJAZFzg3W4^W;Xl|8Fii_Q8%3s^E59-Qd;>FJaHm1qfh+>C{qGu3kaYGV&Bn~u&@qr{Z zTZpxs?6B1kYnIdSOjtO?8v0Z`v+Tw}SQ**2+~7-eDiG{mMpSUwv2QVEqyHld1`XuaM4q*N2O^@PQwC%KLHxrRq ztnS=n0HS3xFbSrDB~UHfKrP>lEzEDxQKvqZH9tl}@t$&@}LyMZ0} zrJ3A%IP|EmZ}eS#wTK*O&oZE2F~Lb}F+{0O(Iyt%Au@j72SCJwRew2i5aFm^%0M)P zFTBc4I3o8vEF?`4$;=yuOlFxsVWplDJL(e<_`}QyRekOF>T*C>c24aZa1_O5YWLq* znqgp8x&XCAcSB00F{fNlWIgBoR%7VkHF_tsKIsh6cxjcVdt+VsA9KyhYPU-?g?jJa zf91(o=cN4MlT%zXs%0{0WlTRm5oRA+J0+T415UGMw9tFW?;0&7`V}~544r|jNo{m) z@da~B3hphFmD@5vgT}v8oCmz5#+wX;;{f_jK9l6F>rRpl^xt*?+jH0>1H#7z7t+iBOsvGuh3rwBG21X#YEs1qg|ujN$_nPZiU8= z|F{*Z^MCgZu~sW}d96wa+mBU?m3Q6a+HD(v7aM{sI?PAON#u<^V$L>R2s9o;fI2Us zHZJCC^e0uIib4e&fH_{+CCE#z!hu1Tf8f|J)!err?5u(VS6%Kirg+kQpQklUYG55O z?zsWy$U((f&mOONl+O*oR;NT(4_HYPZ&=tbI^gCL^eY)pXHnOfb=I#=>(fXdb;&R7 z#{84@i=p%x$T;4UeTX}ia;7eIZr%QeVa!c>)RGPfLv$1;-Pshm@dE4bn3e~SM$waRk*qI{I&{*e;pmIRXZF--18aw+eD>#u|s_nEOrV-=@Lpjb1>3;Sskkz^+V&DOi=Y(8@6kKzo(0H`x!JA+}ClXF;*JcL9~8Wgc~&& zxY(K`$R;QY9enj(;oSvZJ)bKi0J$wc-l*xq4Qdhmw^Pb5B`aD6vuGq0-j_7%$E3jC zBd;7)DJXPxnZ>?IiAXKkNo00{EeyEGb|uQ)%v7_PMza?sqdV%!vma}!_!!-b`K*oJ zsZBX!mVK+ntab6#(*r^+EAIrcW{z$&0xE#*1XJgujHs}6&bzF&Wj1+bw1udr3#sQ{ z+pCtB3XG^nle151wgSig=I|R#CEPOH;rUvZCx7{obadD(b`X-7G5-O#_)4bjqu63_ z05*V*+{uTabp7b?b5$AKq z;EO2Qos;=2Oo`y|vk41gdtTt0T=|{?JX7>HV66>GhK@bb{VdSB;=&^=SatYF1~p5Ph!f=G#&{i5xL`E-weM!?4e#m zJa9hr8&(_XWIaAzJ@hO{GTqw!4B++6ET+sS;PtJQRdlU~;uYO|0Z_eLaq^W(za)lk zU^Jl7kPKrs%>e6rJBtcF z-NAEUW>hTO4o;Ypy65K}q9K{w+%8|p`kM=YgCp=n7OsGXoi}J1#z5;km$9{e4B>%3 zT>94KK*%)E@tq6iXlmT~wJ3Hcu2?p$e3@rZ0%`Qb5s^ev>h|$0k@D@i7dQD*2++U# zJewJ>_*V$9ScdMPNz#XwIxVr!)RERx9}lNhegDDm{gI-Mv%xP8#m=H;01 zo|O$o#l02#{mZ?KFsx;EM)AsUTzGc$cS}y{Eq;(Av;u$TB*Y~XJJIb&Z40Iy-op9i zGA8jKs58_NXGGWxZ~LSLfLi?21JVucj_4ISX;Y#pIIBWP!^G9kG#T{9X70wbB)n#) zIQU8Wp%mzMhJ3>`aBW?p;2U!&5#mX}pj8t>>MoR9Q2I#AQs9+%&CfXbAgi04f=19q zgrGZ;ojY^z+69yZ%{qyX6*p&_&h-EZkhQZi1?+^pOd2SVYahZ`$8}z}z5>>S@5FBY zZn2?b*>t|^7F*^fu@}~^c5o}I{nhjrqWiHs;vO(D=crDYaBysE2^db&u}}IIzag#p z(&`jG9vp|wFa{(|0yno&0ds`>B&buSkcjtw?4(`E_zpJN3BT{=q^fI$pv$x%QuqUn zj6!dA6be0O?GS{n&M%uT{;l(RlJN0v)R}z^;scZft~&NRZ)?A+;71vXgEL_W5i9&w zdAbr7V{)qm4`EQ|TBrY>`|!NQ9l;d}qvaTdT`(U>MqrjILDH2R)sYjd^h`?}?1eix zc4uE7;konW8Axxk<%k`_txuw!*OnTw+}{1*^Zt$#4D-nMwm(%D%svjP`pMm`5J2WHAQ}hORju97k=S zYU3}T7_2NDSmEPT!12EsOD98(h+jox69g)D#P2}u?wluNN0aKJgd}1wJGZ6mYR)Q~ zxGwLh6o70NY0Nl92sT+z#Hy;&(3AOxPF>S_uI@zVH4WzD8_YmKmTzX!@9(B9!#qos z?r0f-Gu(QWgfRWUfK2=sRNpF1oI>1K5Z5h>I*0WQ0O|}DWUb!e;heR@6YADp>Npce z{oT@0*+jWPBJW|J#+iA?kW!Xr$Bq%gIGT5FaEV7y2t(FV+^W+vsl!Fz;hvz+v;W7M+U9bZ;(7%n6kB)R2dwSLPQY4z%DzomN4`9<* z57Ax7tbHNN%{V4VX;e?780JPUbdSR5I~5(CFGJUuqLEU_3{ij=jS)Z9DB6OXCTNF` zqshMa`%5s?-Ubt-qqEt7OFJItYOND`zBz;}u+bCnO%D_VXFLIKi!OHj~^5m6Z^)Y7dfC zU&PPTKC^2SU1AHqPbA~ah{@4r76-!s2?^B-?zhGc-)AAW#XHZb$?u>^N3||L0Ixk6 zC9eFf_Y0G{Z2p@$bW+lz$?N^x+_A&EiJ`sAF|X%1ROeAoi?wfJCFv~aTSSn%07 zy1)GchN_Q0j@Gsie0$U}Dl<<>CU^~;d`PCPqN&p-ESpx4-i#(S3HHu{^uo^XcpG)D z0ya1`<^lA4Lpxl7E`k;|%w1+;8X=ijiaXt5?jA~t@wkCWXWx}sf4-1@&>7IW(?#GE z`5a8RY8png7CX&AJ+47g8+(CKqVLX)X#=YIt5JtwQFq?ucl<`c*VbQV`;5diEk=o` zAMuSE`P9-F&y}K%`o?BS>~+oMDpFf$9D|bkXQ$H-lskP*~09@646Hq zK8HG@Q_5L}BtT>P?_IVCAmv={-@7X45JE&O*d1=4@o12zrlp9+>aKL=)t%@y#Da8o zMe+zwLg?zGA(I=0b5R>d)$(n1;KSC5m)V}^2r9*dV_glT2;EPr96kCP^OVUQSt^8eu_J?dqO)Tf8jb_R@fdLNgtVA5%HD zAz3u#^V-`=+B`baf3D&YNmuyVe%oavP4Y0YA&PJD@+*%Q}EzqIx@lJfDo97SqjaB!bRg{}slzvU% zOo=!ngSpb$=iyn2iep`|eubOn{T0iXRK`4(L{4lrom;LEo|42Fz);g8eDLd4hDk&} zpPX``rug6A^gnr=%8%y%g_CG88k8rO5HTqst?&TQj`+YMBN;J7_F@Z+7_YY(WQD5z z3xwY;i{9zBxRqB<0LkKRW(Y$EVJ>-odd;Ft z_?N9KxdylpOoRt&x4%{R*r12xK;T!I0sN;yPy`9!lZcZd9WD_`FtBXM#n1o`8X%1d z0lG1q9?zS!q|1n1*?rtr=EZK`&VAmzMYEI!HoO49Cuxx1Tqj(F zCb-D}X{bV0xdumj22@!G032JJGBi(9DJaz{Fr$3}_LbnWIL8X|mF5mKxa6!O2w}!Q zWtjhDE~>I?Gn}qLn-6&0f42)-rUuc>rPAqQRuCEWUk z&D*@&Hrmfc_9h2njyRO6*~cj|3x}qEpF)lwEetWk*(U zl&O~jVVGX~eK5#O_2|@np<8-``z+>LEH<*w^(yO}x-x=}M#KSN)pH6W#!-!^f{#-P zFpz}$LHofp_?L&~O5}{!2rq!pnr#Qm1U0MHui&V?NO}>Z5o64nI6hY21t7#@_%d*M zS@cG?p_*{VKmC(&WeWIeKei7R+zVp^>L3CO?#qyfapEz6_kSt?mpAz`!Yn%^5sz&V zxg^W6K_*YeQk zr+{H*CWFjlurIixzajeGwAe0WXGE((gGq)W1JMMRoJVNj$E zhhdoZm4O`-Yy-&6K6BBsE4x&;^bbX9e1OD^#yf0d0+7$5+vQ3_*&OWXQ9lka)H zyJR3LuOH;KZ_wB7QTUqRwW26|nbQGJsl>I|B{E&iBZ!XKSVl`$Y_(RXKaPhTL-yB> zDQq)KvOit9k1~R5MoHdrt$;(KE~x}-tDh9zOPh9lX;Lk)otw;QOd^?YxF9G8m>a`c z;>`*Fh<3U1w!sNlN8K}z4Jv93S7-PU7oJb-i_Uvtk*d3AxZiQ(CaAb|5mzhr-QO*9 zq+zdq@zmf+wkdc`I<{p=>%jl&iOch-efkQxrcQZcBU(lCBN}_fzc9Zmy0$o~CEQre zWf(JSyc*cbI_`_?et7|mEjZww>z=*vkE+F#VmXRlw25_pSz|hi6LJ3kRRATQ0pMhk zUzUrGiCkCyhP@g&i+Y>RkoMPRL?X9*WLrE8Hp2vXA4TDVAXNzxfK(B*NuT*+ zZGf8CYs&~+>92p+99DaCYRSgoM48gO0)!nMJ6^%PlnQ{qf0)S!Rm6+C4(dezZ$?9H zk3ydG&P+~6W@bLZnL8~P?7<@=Faum~YJk$}6Be#>>g+iGFV|s4=^Rn1gkL>Pb7filFgU<4?U&ZbqLh`lMld8#O&sgZ$W$WR4!&zNjiu-&N#A>cFrmIxkPu-c$Rz z(ok)*ws|W!d&ypw^QX-*qOW12(6>}a&h5o~0JiVhz02!V_$Z|+pb~Yo`Bt27MRBh< zv93~dS4vo)wht`tlMOu&Sb)h(+pW~2zic5$suW{$$$DF7Il_4^-a z!94F~+%B>c#w`ix5-MvTdoYJIz)4hl_chvR z9vAg?-OS>7AC#c3ShweOZVkA_2$>;kb8&>^Se_0`qT<6x(TW=BKx^cSzS11mU9Mr1 ztLn={w(+7aX6~V7&EiPnT41oa>lk*z6qIo!?6==1!>?5_tblrwIfMZDHRZp5O??p+ z2c>ohM)-TT22KI>zjgvVH_>Ie^j{eB4cDn9%wW2kOLx52VO*Eg~{br`@ zV*v0Q82NEPrQ26eHtPZ6cLKFRByzs^#CX2pH;E5xJjtlmo0s+WM7vVo39ry2lYsFA z7IMS#4|`iFT%QYnncX}#;QI_V#fYiDC$!8Q@*2OwiQp*UwR2TrEK{f$n(R^QKC>BA zdvrXAPUSJw1Ve$c@A6L(2g9RZQ2J}|;mA93BDge2$vz7cf6-W*BzwhY^)G)0c}#p} zn2j?PL63De9x>J&4g%bZP_2hPF-ZIJMtODwV>sbB0IPHJt{{P1>wY>?2b>)lhh~Qy z8{-996#<1Ja!7QIBy^4pYx&rmABD+ZM3sU=2lsAR9R3l*Ls+JYaH>7R8 zPZFP;xpaDg{hfJFN>)JE8ia+2v}*!M$RJWrp0-eBuoDL(gr|gKNQ4fKnodnCb^VMf z04eB#vkWT|jN8B+j{vp6Oh`tw^Ni3Pp|Sc7G@_w)KS4C-pb`N_`=K8U;3@)pBH0RL zFMOwTu1}Z|RX|-7cAdQpHki+Zp_nlF5DFLr&~%c_)XcE(DmE>MKM-F_Vn!J*h#2)= zVA>^bBrYQTzEW%_fV z{MtK&fbcc|!HxTDr_-WJ$v%usi>fwBj_TUhfa11GHnNWz5c|7?$@`R>43mnZBqMn0 zgh9V%>e0LLCcK=Tp^AZMkLH3J*5)52qt9pRizX0GVhDB1K` z74j83z0hXiRB}+>Y(M8iya|s?e?rM)FaQlS9>-l@4DLLD#z3cKe&BhkS-3*_6^N7K zfi#L5|Fc){M+KovfB{4(EjRF4zf>xZVIxYiN6S#JS8}{7imc^KL@D_MqRB+(uo#;P8q_z>mb$ry(I0 zxZ?i<&p8O;=-Nd-`~|j@kDsu8o;19rjsKKu22O2o)i=|-B2KKz@74spr{pok0RE{{ z9i{P_@bel= zENA8r-m7}z&AqU-J8J2UFNZ*KU7{H#RckM9zxjmP-%SN=}+W@%$8f=*F+ck{V0=ZA}Qm@Lh>k&C3c%ow5AoV5#n zn}4QCHoi7yy=cAlYiuvS-rjfJ*HB+>>dMXbpi)v&HNHl@^X$(*`raZG?Y`B}L#`GM z1xo1{<`#kQ?4+%f7OqiLP)zAl=V&I+(V@v#>w zPGR@00~Oj7ll);YmJ^va8s*ktiY^HZBE1xz%3=ea^?UqpR^mi738~d0f-|iXBr)$D zYyXbh+dWw%QqU%S`4dWXkzki5>3?7F8pWaXsKLFh$^(T49la2bKrltC(~^;n3%l?9 zq|t!z6&p34b*Hi!#i61qTG03EvaZpELycA1CB7TSXzh3ONzcE&+`{oJ9I8EG4N@xE zp(R_6lo9j%KsqNQ0FhoCOIeho3-Gl`ploRx;3r>5(xn6o_RkJbxV=BxwNx(#_3+$i zqxbV(ZDx1Y`%$d3M0)KUqqgTk@{(k4_p6~xk9#&+CnV@8iMdy@D&N`N_e+SN);dlK z#=0n2gvS-6bp9~z$aRfr->NeV*d3A)sX9ge&|*2>P-d97zK0cK73<30h=?WJB1>^1 zV^Li=bqd%`058cs{L@v33Neyk3EoL4x#0xHY34u9doWxl!@JV`ICP+@Xp?QYlNlCj)dJzR|Uhw{Lyt6O5w;-~qb#FJibqXiE2EBx|g za(b_jhSDp$QDru!E6Amt{*mQL?m{|IRWDJz!;%PV56J@syIhaH141&TAuoA;dR82y zW$|*o@&rl#^>YzBK5*6SdVT*?5jt=sdZ(<4g_3}qqbs6o^!#rJJqd7enOit7r)s-O zcHA<(Nb6*m+se)GX88k;*n6h@V&UeQGOUZtA#*T9o;gWmg82p~IyJmLSH3j7jR5h2 z-1_)VI$ihUu3vamGV)P)SQzw~`AshKGX!h z=n~wqv6zvgUP3J;;Z9`*9*k4i+*kgE?oMc=s zH&`M~U_qx`d4&oI;Y?d_cBELa>zi>|dT8*`uyOYDF;42R z@1282q)B+~vrdnD-AO!oR0w4^a=qxDamqa?vG^HoDdavUc}xFqE|mFxO#jMcA;YBnovK32tRqnwVu9In!!)uLE1r?EtFki zx^q%%F}r7WIqJ;{_GOE^$Ss*x?^|3HxJejX6ZKNKulQi_3mNZynY<>4VV#3jjvyM6 ze5M{EO6*E)l{Pv7_njsSG((7@>Je1Rm`}cT-_(@&h(v&Nl)oJe(C!RrWV;92t6}G2 zt_$2L_7JRqT>o3;`?SQ+*J;>9xmIXgqoP}Rpc?d z!{l$pF!d1bt`x_Mnecwho@ZSaQusj{s&qh8w;e@+MVQtrC?k`4mmMSH{-ARYE2bN9 z-6vql{Y{s{9tg4e+xa~J>)fcD6&R*Lmrd7LhBJFCrh_*?OH?ZLg(Vo)1p;9zR4um%y+a*HO096k$Zz++?xM zRqyRZR#<+-)7)!Ot?amp{PvG_bNswohvC}?TtQNQUTlVMRP5Og@}$B|_BvC(Ke~WL zF{0ydnX{Q;RS zk(k0jw`N>vrL$Wx6Tc{C8GmqyE^)bhS8>8ox#76z$%SzE>ur9vWlj0Vg5t3PmKts3 zO!UH%(nQxfOL(lMI+xDU9~;z~t6#d*@rO*1L6K78=L=>5+-~chzF<819`aJN-Jgrs ztwa>4ETh<~Mp*Jch3!1|hv9Vz#pj4(@k1q&8l@TZq0Y;VUZKhJ){_>PoxP5{=I7|j zAighX2A`8{)B_}5$>x0hZn^xOE%`g883)f$E+379SqOiv8ONb-^va!;fbp-(c+6d6 zDwrGscmjl!N%H`7)xOn~_DP$tQmFxXR^|o|v z`Bo==xM5}WuAb*!qW>O=x-{d=)4dOxUCO&}6SS1Z`{tgG>x@5rQ_K!q-di>#;k;a) zoa>X;tA8qQdF#(_KY%G{ z&5xdsYs$+no;NMnfF)1QQZ`%(XenB7ZpJQhZ zIZ>3~eS3fX<$7Av@bYx!=7kX7%mrU+S^k83cio!a8h_bgXr$2Uzl2;c*B}^d$dozW z->J!qd$6G{GJ3ub2pPU~P1dfV9n|IlWY9``UvT0Yg{a4mD9I8ESQ+*`bJE@QhP~rE zC9dYk3=Oe8I&c*F07iFxfx)wb)AcG_E|@Q33N*=NV+zKCf^rwe3e1ru^hpkReEX-) zW|eN2;qeE2f}~XsnkByeZyw)d_pR236wHHTSAVa^hMcLSta6^#$G;Z8KaB1>5!Y8# zzl-O6Z@w$W*br;a;|e%0cjYDfhwqDX`Nd7)pB^ETW+N}Zo6>nP?i0&_a^SUb`4_)8 zF1P1hf{(7vcS|2gvOe1dmb-*l6L-pk5RXN zeB$z3b&4^Gl{i7Tup%Hk6WDJ0aAyf(NJpp3ueP75O#?93T~VAscc*zNq82_73F1AW z{9E7ZkqeapT6xWSizf=3Jhf#(4bdAi_>sQFuV zx}Mgh3+0!|qaGqhH90)sjqnfr8sf*wt+$`{d-!rb>_+>(gazn*a`XMR*R}nTdtYC0 z=6VisTY_HzA!n}p)lAT8bR)G=YVz>`z!ew`Zn-w@K;-oRObleuhvWB&;cYZ4e$6zm zB+z4zgJbOlM*mNRwUFLDpta8xB4m`2_-W`S6ZII1YyvJX*3vCwxXbXK&v~j%L%7xj z;Ev(*@wT|~y>I7{Ngl`xUgrEoOGmuo{4?>$ohIgXs=URuaku-Vuo}qk%#CEbtV?FQ zcj0%7jLT4z<=lA*Bo?_Io@NMsyP;Ug@D-XwyF+y?0;G8yrT`V~inK_hkGq*pNE3hz zw=<#4biFQoDSif^kz$&vUo+t7#`s`dYO9(8@vGSFQWI!BUj_uJo%({`)$1s50Bn;e zYyCOPBLk)E-8uL*8UNq}nePL-eS2U~U?=vNSQ!>)BCc=zi=HlotZubeOP2Cmd&VGf7BW_2p33MYt z;5$>V(OQVk`>df|XO%lpMz0HnFSRaB8{1`-ezgZ1ZRbq?&C22^)t|sQifDXi!m~(O zCC=FOeLer)*BuB_`fom;wu-G?O;%G9((gl=0bkh8<6bVZ65c?JenattERp!0a%98zViIB)(ftkl1Mr~pwSwhGpZD=E zBv3xknlbEP59WY7qLu8DIGBuF#|U+}Iz4&pQV{qP|1>8IRCLggTuYrush={q^#Ee* zSL-O!>rwfR<#}QV6s_aHqWRA3-j`ai!^{xQFVFX{+H?DBDdfXaIOe`|KX??aBXIxx zPi?9YGNJb08gLE{y}Y;Q_&jSPYL3ywDYqv$v@c2h9lJ28cxrvsg$VLY~ac5OFtU2rFvG6NY7Aq{EMN8b+;-1~j?umSt4?m&N2zY*mkVTRu;h1||EdH2ha zdszM}k`Rr*cBe6~zdxBnJ7kyRO63cCfktYAnr&U?%UuNroWT~@eo8kr_+Nf15()|| ziso?IJXrE0bqkp>3=?kZ9yXC|-|w3%fV<5e^>LK#X@OkqK_B; zFizjx0QyFZrQ_h+tC9#8N+x2!5@PAVIqIm_5<$wO!s0+KjVRD5Sp@MEA>e*~KLlCA zWr4+vGJCSSGXv=&J)3Mlqf+~3RtKHy^Um0^X~r(rE&P@%WaTE- zTi=i*DRv^m{sMQM%RPwg^W@h$HBou{}}y(Nv8U%^-lxvqS=2At-;s zagrSTJ1;+%EddsUpQ0({NGQ${$B%!h>snMR=jTkp%T*#|((Q|(1ila6lkI7$pKRBU zGY(IX6L&QVYPvv=NqprCK6-PUD{#le)$K<$z-i1Kl#t1q`@q8@_2mPtbN3W~xBwjH z;YPA<0mI`gy<5CNKq5y>ac&rfx zr8krbqm!$m3IH&cs%4YHZ{2nef;%rfmj5MJL^IjFF(DXs0~ELkuiV*yGs)>ZZgHIO z4KyQ}4&gnuv~W^6)Po&n9b&C`EUoSF=4PH#?x&8VZjCgYf4kn=%Va~|}@vD-Q zYa^N)8D{>D>Np%YOyd+RPBcYvvZN|EHAMACM6RN1C7JtzXgTw|b-%UoIW%lV&WJD*R28^23BeV^E`T~g^dypT})thPJxjuBDko82b1@AwFGe$lTJhvmr~Q5=dh8#*zdT|bEtsi zPesBMj9lc|LShUhT@-`;G_2c=@6BRu-FOHX8*&bG4hWCEpTo0eEL`~Qm^{CoDs4+0=%#M z>)oM@Cf$6n5rJm-e!I#KMJkF%i`Ap6#z%R5(DnI8D#g(qD!#fNa!X+Sd>sm7nT#_n zSiSDpw|A4*=e8R9VM_S($~SoCY#a9RqVFoC;@_%^Xvie4G#h*mIEeYAw!D#k>rV7C zZe2J9Bx5~<2MaCSgKarm>^p&mwi@+wK9<4!tXJ%xb(J` zX?y#E&@TwovUZ?Eay3w9Biz%ck0?X!F zIGfcVE;N~0nFG-+CR{RGJPO{MzuLs+sTOW(a1REbq){MZ`JMd+XnSU~$+WKadg60- z$q@czZj1`O^6EN~k3AdJUauCZ7h|6`xlaDN=`L4=YhPk0^0JY8&0P&8n)jMkV)x(^ zYJ_@f&doO|k_Slmq<6stE0x%G@6EGmXBWy$cfWR{4M&ZaW8n25ziQgXw#jjM!lgaR z)MJn6kivuNi@O&tBq|)nH$2^(^4C3ao z`x;_Gj?a#y1RNJ-7W#DcA^>0;Hv4|_^=JO6Wiq1UeUj0}vy1}V`aSc{?u9NMjuSCH z9qUF2{r!AbY!QI#-s@>Udt(C$w7wwC?RVoq9pln(#vz#91Fa?1Sw%{@7Mxt{XFwwg z`MnX!0OT}UX?8(}D(uv0uR%TuyV;gzoBEN!I|E&SO{oxWjK{pE51R8)Tl0|qA|=ds zPiFO6;`sV(N!EpUENXr)+=|Dx(@Fmst5mj8&*fYh9jMJ+t?2=UA}g@MSA}=bAI(Cw zcHnL_dkxTs_+5x!yXnv*dr;*%4rWmoTkK-Eum6@=C>Ol5U+^t{pIvR5?e^rUx@B^Z z%5o7jB6Io(kQ6I;3RlnwpDeE1%!HCHj z2p8cxvFor0_Yn&HT*EVkB8pZgiaZ02U;4KJ`@Pbb%oO?ljR&FWdjA>m z>};cs%d&7}TD7wl=Vw(hw#uY87`Cj2>n*QK)zkmrT}NIVa>E++-JRC+(_GtXSg2?f zZ+}5Nhg-2k07H^iJMjY9v2SyTIl0AucDwnGEtieoAG-naRJO%d%sfw}-m5|nZcK+rt?hO0%wicEFB8i$U?bynQzPeC+dZq zmg65ay_hT3)TeX5^Sk@gu#|I0A9T-Ay!DVx`B(;$mc$2~4|fLks*SK4GH@l5`S+Ii zrZgY#1EH(m13tg~MJ}#sRW+FaCw_e{FI_s?>5AM6`aicK!wCQ;m|1O@pnh4sTYJ$L zW5H8N+ztpV4dlEzR5to_LyLkw?034i>oBAvjI9jD0OJqWJr2K}{@|U4yYwW+LbP5}j(6i*b`xG)L-X6~Z+&qU|{o{p@cjNCedROp`0pl7_ z7}j=NRJNMM!~J?sz*G9vS#atHN<6!gYs^w?mvGc!Eu0lZB)UTxJrCJJS}{lIavwl} z*=Wk@m!=j)QvNEtd>O%j<(qgKuTgk6cP4UKOGQ|SYx$Tyg^9jZ5<0sdM(-9ne_o&O zKi4-A3fj+b+CPcf@1G<6H#)|*=iC!_|174Fv?$vk(vYIp=87GJg5H(?7}=#ih4$@M zZ_u@8N=1|WIEZa<;XWmQPQ&A}@lxw}U@hwlz$2uMwxKEktx(Y4`Iw;AqW775eum?m z(3Lxnm(^l7`5wN*{;N{Ov&G=g$W!g?RuMv?3^9?=JC7hYdTeGmZ|m#If=U0`cBKRFrdIs}gU#3y+ z+BpEyh@E5mTKZ4J3iIl)&wKf@cyb`oE@Abb3MIQ5z8tqw2j)-BN0wMq)>lII%Y_3^ zrT^UD&mT|VhLuaFge~>g&;0rFg?6S4Cu9Gke?IcpP3Xv;Vczo*luG>b5Ptr+y)mpP zOPL?cewT({3r0^oblXX`;ix|!`D+zff^YF^!wrr>2=`1joScS!s@ zB>t@uod4G0Kkdi=6AK4EJEHZE7U17i@ApRH-+jgJE!w{up+Eb=e}}~X$&g5(nN5KH z678R?{Uwe7HoLjT`J0zp{4%sS)UOWjp zU}G=fb!gDQq2FJ+w!>)#2-?x)_C)l0@s+Pn?xw&wr0cPF=7&D$%wCC5iyJ-AE7kDx zP0d@g26r%kmP!T&)(AQ4jz=3gYu)#Jkt^5TAKyPwFsV|4VvO&W%Y9&vqXBr3mbw1! z@@GWQpf~OEVHMTxP>6h%uA}hb_m^*amjJjxu@KrWYz4jkii(Rn;=L*rxw1fML+K^5yQ2{;!`!Og!vzl79C|2YD0j ze*X~W3%|t+7YJ;I{`S51Qy^QU%7ISSdRKEcg(|iihv=w%3mvRDv7Se-Hh=98ixbM; z^sYt=Fa&nu6M9n{Ar4_|8~XL1chcg3jqye3282V)Nv&r}h(3b`Rb&MsWDeh1I1XQj z47jdj3h%nLaqult5j{bH`=ffGMz?b=NZW0@pe#(~`|<*Ntxpg!e3qWwwXgO(8KkK% z7osaq<*Y(fV`R1igqwJTtGiKXY^Ksw) zaAT)1Zf8iNB>{x0x7Rhjsme$}1ftu3gW4W#5`$BfsL1UcK+zEw=yP@_}Jsdoz$I{Cz2@{ zLy|epcJ*hAx`Ei5@&!@{eJb>ZM>8lAF6wVz-*f26E-_>HAA-z{=X#69Zh|IbQ3xSK zMnG{GA_W)wF+-dJv2czc8K!_t6hqkLj^fMZ==6%$9?|E1)gK?CkdMRl&%NrY{y9ea zQc-={F5MddAx}nf_h0Xn^#TiQ2Eprk*-tZycI+M?4tWrDf-nk6ZR{&BggZzLJ`S`r z56C9Mm@p{Unbe8$p6Il`o-9KPMA$!W>M6f;RX<7W3S{+^hQm-w2JWD;ZeTp+4vpp! zK^5^g**F$%?&XsWK7$B>2a-$sy8KqoB=K@>UEdNQtdRK@CMZd2p9s!<@5w!Ws7c@* zh0HnOJcX0tKxD5Gy$3oHa=c6M65(a!!39L>kW2IXtMdLL+cHQB1Y_sRzl zS7c3fd>hOZc&!hgeK6VS@uomHPK0-Cx8>O!gd}@ln?Ojn*PDj#5v+kpdv0Jd{TOjn(1x~ZW+gTgDk7E8}h$)p5nZ0Ly2$Uk#eK44W=W~dmxLV>(=7#tGAb5^!TWA$6gv-C$*7K^ws*T6^L?S&oP zlh8jY;cEyS#~SjmIJ)aP#*;=VQ%*os(cM&Iw424D>y|N!nqLz&(981K236Kaj4C5R zg1^@Qgx6$*XsDZfs9YI|eabL!Jhxi^-UL}rd_8hBH~|3Gvjn^f`8cB0fHmj9&4}mGMs#5v5q+ z@GLJ;g1~dH0Dq1lH4<~+=)oxwUf1RM;<6drUscd*6^rQgR>t1E4svSpu7~bgjpA}I z<8Rhu+Y4NTOoBV`r&<%JQw~j@a@89rQOgprWEdq2Fq%bv2wa?4m2mAjrB4&*^DIdT31=`NkGarnah&JIjFPiT23J?!!Lb z4q{-!#tBOXg}g~)jA48k6z01slgs)NMI-Pgz&FR-#H}S?;74N}#XN&5o8P=L_POHT zC&%hOp+uSMzAnp6$H|rnigmI}HwKJpqSmvqhdqhDKi=bLEYaO)YRMlZGkGUC!0X#U z+~PHQ{qgVW<7mq;p>md1v&?mkV5k^7OVH+Lv1Fv$_$6fBT-8>4oY=AJ$O{o8g;uOh z2){1zt%Gg=5D;m!+^0}4u+m!FJTymg&Q+|aQM0}E$)h5U$@7(agQ`IDL7$^%ip-E+IAsh`jvx0mn2 z1*N&!&73P{+CFJNmcB~;fyNh+#DWu?B*)B|_lVN|i>e%dL~6uw*-8HG;hW&Z+OuxA zTrMz!MQooVUJHOXxs_R4LjzfkKC~30YF(&muDL(VfX zQXB)T(fZ_T=_!GncB{&{S8^7tmiag7f&8c|_heH^m4>Ltv@`!>BFeUloIzK@u@a&n zQuFPBDe|19yQjnQIi1l$N$V!(6#MgnQjT~{d1EttS4hQp5E zbdb%vP{`0mefm_*cdwYB8L$dT|MrFou?PH~S|3g6Urqm0;+ z4R=xWEqV7Mf-AEIYq{$z8YmT(hEbNMuyHNb68_i8ETqG&rl{KKe!t4hCuconNIP&s zBwq_1DZ?CN0Yl4#4uZfblD2!)5B;lE%me{%`PThKhB0rO70T<s0B;7=CkQF6tM0Wtu895o#QEkW+y6gDUulfFbPn-rn~}$fU>*gMnwQx&yt0Me&Mm z6!+E1l+C?s^Vt!KvqQ<6o8Koq6npxbL;tRNB9dB3gd# zIk$a>gmPI1x@Gb@&B&(%DaRIXs&!J?%u>EoHLGacI4PQrGG~)(k;RrU_BO;%XT{uc zoPHboz$`$-JSXN`v+NtfshlI{n^#pEk-PaZRQkn9{B1|#1?>qQ%p>kfYo_0MS{BAa zkR>ILlC(-={BErRPFirHA|aj3cJxX`^(6I&PstpU_;rN;1iBm~<}*Yn~A4;7=YqE^cC1+-Y~&Uc1$yK`q5X$!v7COjpo^s5vR2;TfZvq|&8M zj2IwioIpF@sng{u9t7jXO}m;uWoQ#=RoD{&4)A8~nV9`yda_iETAX9hc0F3ETSBti=$!J0JNPS{m7&;GZ|jHn#fVBG zMkZdXmmG)|=gVp)qp`Oby-?4v2N_qLJ$rBaU|ZkT>vj#WUKJO#su3-h!%y_c`)P0c zC>S;rTpxrj<$S*-+K-@v;+ZnW6ZB3E?tU+T9~3C1w&`Kx1kk|=r^sbYV~r+(YT+F< zO@(%yM&zejqgM31g2K_uxO$a1dQ4>f$h)(I^?1Y()pd$-qOiXekF<{9F8{O-UbMZa3}3)`MLu~yd6CgKZ;>a7vo1=u z9Ew_m&6<(uSbGh-O^=KwnjYfn`FTP$ZlBSim0ylCg~1$DZUsf|ZnL;jS4HPL&poH# zr^(=3n5{#es&PYpsZ#7XEuzQy{80r9H`m7ZX-wb7t@${b16F~N?y}Z*`}8Egj?G83 zRkJY7d3s>N@S?88YII8#({_#G#pHF7#)e|83H3^GbW#HWyLLQzFBebvj#pzkVT42J zea=={iKau z#l1mdXgyi+67?&p(JlPz37_(rs#nkTJ_E_0{g-?dt5wx|FBKnYA{;o+q;2@9*NU4? z5;$C3{=!e<>poC`+~1J&gac!PS~nn%FRBtC>}Y_0{Uq&obI7p=>++eO{&PZCkABME zH<>zUUfv?y>tX2ny7-$7W4Q0dTkT);O#-j7X~ZhgZ_{4`(T&uo85+67R9$cC!R;z~I_RKL>;qPbdfto>{eA_$lnD8c7e(Y`pR94fKNTZ$ z!pUVH{L((UN)*l31h`^Fb36Giso(b*)=U;cRm=ZC4+yjFtG~0DzNA5Tq&8RQli5@I zdMUU`O!Rx+O^b1!s&qf}vFq>+_hY>B$XrD4$h+G5cvsclco_6)GGFw3_gTsZ=)O=M zfjRn;W!i(LvA#IxPEz1*)RuckiNj-H<)8`$R=NGQb$Ns5q{AXG<4dsN5CNwlN zc8!w?R_Bp#rJoqx0)EIzjmcY;LbDqo97|#{*q&(lF7LC!p=&`$#&u~-WwjITywIkybLdMjpt159lW@osB zIo}}?K| zk=!gowewu2QSm{pqHAqvI3ocQh0Y%Ud1Q+;qEavF;ulee@HN_^T->=yi9vF)4MUEH zHo7b4$YumE-8?T!b$>VOaWvX`6fMwZy>M-x+^IR*7G54p)^v<}aOEzKRq;_n-ZrFQ z3)RG?X5UaQmu*v9tFk_2h|D{_{p{!Q>fnx1Wpp-5pm(d2b~YV{3oMeh#nnx_YM&^a zIS>HPa^~E=6oMDQSpCkr5u8by%XKXs@?-uZ;^X(6$K?ADT_1ES*Ti!ewz(Icsg4>_ zVNay zicXz#z0ET;u0+cYMI zBV|fJAGdcnQCG^gbJ0#_G9MR_SykC(Nmty-6*qdiN%v5O-UsxF~<41@#qY??vKngExnJ7 zy&pBYc5Yp^r)7RCiza{Tj1^1v*JBiXu28#kvejnd7JZfxGMROD+OW8jk1UWtZ7vXa zoN7%nG}~6)n__gjz%@ZwurD$xn-)0*-w zyv)O{s@z3X1m;6oamsZe&Ahc{`C6@e<|$M^i!QW2Rd0r?hxj3 z#L_H{GY*S-V+%Qprpf|T>(f3xQ%m@}+*%%DLtTYTRNYAXCk%-^19IbP`dBK(QpDh+n{oAWjGzh1ypwOT zp(X0uEDo*#SDyZn9ON48EKRkR~Uw4K}ja+c= z6G}{Sm(N*UNnt({7sz2pgX)K!N4Po4#Y=-cz znHT3%c>O}?$5dSy>ujRs(id6eY9U_x&9xxc}3bDv1GiLm)ZTj%riFY0MBY`p$TO;{JhPJbH%1-Zr` zWCEqjeDw7mmz^g_;9r?tNuD9$G|M&P0%hkt_sDMtIiC5>k&+L8D^kvgCNvFp-Oul> z*;;pq4R$pje~i>Dc+Dt?^r^U_Lk?>6$6jFur{s74^-J?7O|PIo81Hsh;%O>iR;ppV zeem1VHwI9J%053r8Fp@drslNVlz#5-3q4Xi!&Lpk9=wrZPEuM5F8sc}c!x4E3_?D% zxwFZre&RL#t*(q=tZL4Gg*k$6gh13%LD$2zobKckGbcz(*83I8D05`x_7vW={^)r2 z`?7Y7jZ@hi?e?50t$iz$h)YHkgw&yRaUcwtLIPEZ06mq%dkbkLzz{WJNeFPI?U$KBdG43ZN0=5c|g)s!qLTppC z%Qwd_eq9PWns8 zh;}C5n`jYtjC?>C#|;r5yO{u6zSC!^PL+;P0rlo)mz-09<nE%#(B>d&Iy~G z_qp!ypZ6=9u$OZzcCH_B_oJWeK7Q<`Q`|D6+n4Pj_&miBvuAt{6VZe6KSS(jz{zah zb_4-(4S<>OVQJn5O_5CGr!yq?21kOU<9^sO1$&j(r= zU4%ZkRWU^9dSyzW4D3M%Zq6aRO9O;nJQk?}WZW7#vW0?JO$^#f;S>&qOt>*$xS97~ z2_O+fZN)ZP40{>S0r1~x@UeL+=HQMyNg^g1=E3HF4Zk~>c&6F5SSBs?#g1-DBUrDF zeDgTZ1mlxSm3YmKnm9;Uq96$E0RSjVCj$X+&nnM;d*Rf2*&DsWCZzQ^xuO*1^tQU_ zQ!9*|<3y0Q)xIy>Q|zJila2z7I|^8)A+6Z-P|cR6c3pstXd@&XKP{R z99Y);=JorEmHFy7AEH6BUlnAwEXz(WL(F3|AkxA@I0m{9FC#>WmzPea&T;ma0$hJP zO$H~4IGns>`{)V(@n%TWPJz&uN^1;u{8_Y+-g2Adukl%1f9e`3>WvnPCIW245N~5U*FX+H?#&QmlOQvEkrICGtK%UPK(bn8h~W+et`?kJh=iV zZ?ub7)i8sZ?$Q4dFM=jKn+-AK(vdtCA_WI7U1|fibraG3JB{x+ ziLCnSj_d*VKKVF$q^ue^s&0wDO9_X)`ih7vpyMh^uYotx3K~4q++3|e6rGX3rA8fq zXY))%?l5GpuyuAJPNd{V2uvwHl%mqUGpb7>kO&;z=EVW`_sMrKar9z^FtoH(XFKBC ztUndeFkxNhL(1gYIM%Rrc^1x9k5~qu+Yu+H=a-lXLLsO-x8a&qBw|0@&D!oGFnW&& znQWeIFfTLbUhL}to#pK;&W@B5srx&I=Rj}YNpDk#yHMhnZs10Grr;XvbM>B5hM!1R zdc}nc&yxNs=#h%?%x59j`fn+Ikw;x={oGq(ofw#WoalhzMR{y~d#>Qt`f6~LRhb#X(_Y(r7!^|BszK` z$h=1LgKs!}rBG-tUgr%&@ioFA@AgSay<9SvWc?19Lm8`O`w+S46nZlz8?h)JF!u-Z^{ zZP6t_bo#gPp~FO%h+d4GWF1RRe$ilt9YLj@4MY{SG@ww9~UG2y6BJT>D zY&UY0R`~C#ovY45+{V>db%rJE$33wn#6b9yQdXC_gV3^Y%E*1g=;NYvf-l`v_%h&PE3yYrif8F8wqK};90=XLZPsow>2N7BzzZ#hix zjzf);oqcPDxyj1yjtWFKlFDyF9T@E}+5SM$9CK9U2qV$KqEH z1`b94WrXD1&Y)<6!@y~_KuZs2-zOwpc5pkq1iF{N+HM2>q%m~gD+qrVHeW5^n_l5n z;n)4w&SWsxw3p)h@Ea_hhu7JOuU*oZ&7o-DQ_&9}kDjsQV@X_vF&Bu3wazg898_Yp zpAK*!g(NPFO5zjc*ez-J+m;OTz!A1YY~8-i5t@zBoRat)whXuS~qX zxTlu6%FxoXPATrGq{^#4Srr5Yyj5NSQAtp(}(KGY{?#_7I_&JMkz?K zzU&BX@ceN&?wIP&G@->$?;Q~|5#Ck;>xtjE2rEZp(kgQ)osEPz{@t2)mm|m2Iafq+ zLCm0kl(qwGHV2ejIm5P&?tU$Hmucx!U?;kWjS~aYb#pyBnJ529!h0WyIm)FAz>=ZuT-pr@+eY@gj{Dc-|yfo$#&gQ?{ zVp(fef@jS;D~|y3S^6OVimPfIDnWj!f@cS3znW+7Qe})JdT;OgYoxBJgo(;t$yc?U z(f$K6aoG+y7Blmgh-XAtYx=J9$GIefGo=#cC^o?*LxL*Zh7kofxV@@Za^%HD5nPSP zqU-)0bdvqvwH_A^3>{S)Jp6TqX9nO02Drbo9vk5v(Pr>kSsZLQv$u}?iTsw zTs+FT@NCR3uBfe$Ip(+wK9d~pTQRT=VASN@q#kQGB(^v(a;n7BE2JuXy8o&sgSsp@ z4#Y-{wK8Rj`Az1U^QQUwSPt-wuZrA}Zn@e~nYu5Gcpg(;a@#Pz4#aY-7HWSD!~?=g1T zCu!Ds-MMZt<%nw0V;TAZJChe54A_MHxcG#=y%f%3OdTQ*Tllgqu95RXcf{vb<$LPrn^6n!m8tuzigeZb z8zc7VO_es6SItzPYizPTUH8rx6NDV0c8VaQ!i@wgl~^pqly27B@Fh39L@ZNcOng-sXiM& zM&X+Lfu|W4JSdW8dIsEl+?G5&8kpHEe%-|sOkk>|af<>q^4au?{jJh01BSvQolce( ze3OeV7bi%gcwCI^v9lSh)#D2dZ@Ql+o;bJBDvrlL*mYS}h0}U#2&O{q`+;KlQh}8%)(=gwb}kI%0!u4EOsgo8o4l4z$6z z8#l238BRzk3$TDJm4^Wa!hgot&-!)-2mSZwr=wT@`%>W3a|NKAw<@67|5XFQwfPym zFTMWz@Bh`wz&o@8i;Bed6!YJ-@$V6g#LB4VT-NyGAo?}7|GnYgxW~Uw_|Jg*zceID z<+PxYBfA` zG9$E2%j_xiY2;q@dMN}X`PpkvWp7?T28TkqbZf(oE){90yr8LT{9)B)fTZO%KoCdj zYF-0bBy=KcM_NUF)6f>*0i!S6*B)%zkKiX{B;<`3T;@n9X6HaRDDId`h*w$ZRLIrR zCoi1?5AgzVR&-|O@5yr}hiwspG#lXhDPZ^3!9ie#FK9D(;Cf*O^MmFT@C1tPe7Udg z^5o1i61jp#RzhL9|L6e`l_|a2+4t=!93KZ8IE(HpS#MoX#bj zhTFH58b%fZS9jm!2KXV1jvMW)XyQxg2N*9wPxQk2){o7*7{fY+`hP9kvI*rv;)fnN zP(Yru_5qx-sN$KwE4*XPPrW0FWARf)wC=x96w0-q(&)hYT-BOL2y@nv0b$6QNpltxa$&#fw1eyU}IJzvP zWN&FO8BnQpU~0bnhPnx9HM7m;5!Df6_dj)QzubS`{O$fpC?=$}``ftd5C=W?Ulu_U zf3!gCk^*PVDqI3_BMrJTI5LjHvyuC!`Q8>@wRy-4bp1I$>{9q+-kv`}25;-jg=@CT zr*&^wi@yM9f&vKv&+M1^_W{22iK@>Wy~I2T@Wg6bB=NJNIqEyWJehu6G=SVbS!feE zRGx7vm+=>S?yGGW#G@Ay_bmWZ{6C>gf>A5wlAUI~_~vWnEMj(@Xu z9D~CZS*;8LXedpYLSkR84wT0S7xbTpTuVlh zH7|j-mIguNpY+p_9853pKPSkcNM~WDu8(Vj&`NglE2N_aL{f(P2qUSd<2~Z9Jt(rj zeM9F$UWG*hN1F+l+5JE;yPYw-rS!&MeV1&4v7o`5Gf94=QHXbV=5qdW^<*GSjO?nE z@D|vx%eR6KIl|dLOV5??rZUy9Mv97V*fPLZmG*A`Jw&5ShdhEKw=eE1uh{zl5m=t3 zZ-Qvq+pjhX;H|F+Cd(iyMJ-5Oq7Kv^J_1_eFL`f%>~LFd;y%ywTMhSXjs3!gGM9gQ z{Pdy6Y0(CVLe|Znupdz+YYpJ$h=}NWmr1qS7>FjvG-g8~c!$f)J9>{e44$fPQfz4e zp-|K-yhDYA+6b*3|89i(ePSqV&lm+SSCS79#0 zTud)Njf6|tcdexrEIza~HxH222Z8sfo~MOainu2TW62=Bm;SPLi`CN?aJcB0{j&X` zE03eS#C$_%`7AyOV0H$oAk2 z9~+V;q2h-^AN~5ay6y&%*#d{flVL)qaT-Z%H=8JSWGMPj1>#*Dcs zGnH03rt7=cIelx3*~0p2KgW;lnC1aWxhj;V>5W4qo3U|GR6S zVC$*(9d=x4d}4Q=5fynrWq(#P#^g0ERVEvsw%ttiu<6o!1XXq=osArYtBzil_1Mb-dMd^!;=5)6M}yRIzIdWv1geTVb@1oeF5C#o^6>M z-Cs{#mWYhgirh;tgp;|S&`}GP%MA%?-#$BEgR!fLEM_hyM?d&s7A*jc(LghJrjUry&9 zpk0*Tzl{k0`yX>n>tMI|?+5>EbN(NB6zxA&e=jW+U(h8guYy0emOCu2;C&MR2V=-D AE&u=k diff --git a/lunaix-os/arch/generic/includes/sys/mm/pagetable.h b/lunaix-os/arch/generic/includes/sys/mm/pagetable.h new file mode 100644 index 0000000..8522a11 --- /dev/null +++ b/lunaix-os/arch/generic/includes/sys/mm/pagetable.h @@ -0,0 +1,318 @@ +/** + * @file pagetable.h + * @author Lunaixsky (lunaxisky@qq.com) + * @brief Generic (skeleton) definition for pagetable.h + * @version 0.1 + * @date 2024-02-18 + * + * @copyright Copyright (c) 2024 + * + */ + +#ifndef __LUNAIX_ARCH_PAGETABLE_H +#define __LUNAIX_ARCH_PAGETABLE_H + +#include +#include + +/* ******** Page Table Manipulation ******** */ + +// Levels of page table to traverse for a single page walk +#define _PTW_LEVEL 2 + +#define _PAGE_BASE_SHIFT 12 +#define _PAGE_BASE_SIZE ( 1UL << _PAGE_BASE_SHIFT ) +#define _PAGE_BASE_MASK ( _PAGE_BASE_SIZE - 1) + +#define _PAGE_LEVEL_SHIFT 10 +#define _PAGE_LEVEL_SIZE ( 1UL << _PAGE_LEVEL_SHIFT ) +#define _PAGE_LEVEL_MASK ( _PAGE_LEVEL_SIZE - 1 ) +#define _PAGE_Ln_SIZE(n) ( 1UL << (_PAGE_BASE_SHIFT + _PAGE_LEVEL_SHIFT * (_PTW_LEVEL - (n) - 1)) ) + +// Note: we set VMS_SIZE = VMS_MASK as it is impossible +// to express 4Gi in 32bit unsigned integer + +#define VMS_MASK ( -1UL ) +#define VMS_SIZE VMS_MASK + +/* General size of a LnT huge page */ + +#define L0T_SIZE _PAGE_Ln_SIZE(0) +#define L1T_SIZE _PAGE_Ln_SIZE(1) +#define L2T_SIZE _PAGE_Ln_SIZE(1) +#define L3T_SIZE _PAGE_Ln_SIZE(1) +#define LFT_SIZE _PAGE_Ln_SIZE(1) + +/* General mask to get page offset of a LnT huge page */ + +#define L0T_MASK ( L0T_SIZE - 1 ) +#define L1T_MASK ( L1T_SIZE - 1 ) +#define L2T_MASK ( L2T_SIZE - 1 ) +#define L3T_MASK ( L3T_SIZE - 1 ) +#define LFT_MASK ( LFT_SIZE - 1 ) + +/* Masks to get index of a LnTE */ + +#define L0T_INDEX_MASK ( VMS_MASK ^ L0T_MASK ) +#define L1T_INDEX_MASK ( L0T_MASK ^ L1T_MASK ) +#define L2T_INDEX_MASK ( L1T_MASK ^ L2T_MASK ) +#define L3T_INDEX_MASK ( L2T_MASK ^ L3T_MASK ) +#define LFT_INDEX_MASK ( L3T_MASK ^ LFT_MASK ) + +#define PAGE_SHIFT _PAGE_BASE_SHIFT +#define PAGE_SIZE _PAGE_BASE_SIZE +#define PAGE_MASK _PAGE_BASE_MASK + +#define LEVEL_SHIFT _PAGE_LEVEL_SHIFT +#define LEVEL_SIZE _PAGE_LEVEL_SIZE +#define LEVEL_MASK _PAGE_LEVEL_MASK + +// max PTEs number +#define MAX_PTEN _PAGE_LEVEL_SIZE + +// max translation level supported +#define MAX_LEVEL _PTW_LEVEL + + +/* ******** PTE Manipulation ******** */ + +struct __pte { + unsigned int val; +} align(4); + +#ifndef pte_t +typedef struct __pte pte_t; +#endif + +typedef unsigned int pfn_t; +typedef unsigned int pte_attr_t; + +#define _PTE_P (0) +#define _PTE_W (0) +#define _PTE_U (0) +#define _PTE_A (0) +#define _PTE_D (0) +#define _PTE_X (0) +#define _PTE_R (0) + +#define _PTE_PROT_MASK ( _PTE_W | _PTE_U | _PTE_X ) + +#define KERNEL_PAGE ( _PTE_P ) +#define KERNEL_EXEC ( KERNEL_PAGE | _PTE_X ) +#define KERNEL_DATA ( KERNEL_PAGE | _PTE_W ) +#define KERNEL_RDONLY ( KERNEL_PAGE ) + +#define USER_PAGE ( _PTE_P | _PTE_U ) +#define USER_EXEC ( USER_PAGE | _PTE_X ) +#define USER_DATA ( USER_PAGE | _PTE_W ) +#define USER_RDONLY ( USER_PAGE ) + +#define SELF_MAP ( KERNEL_DATA | _PTE_WT | _PTE_CD ) + +#define __mkpte_from(pte_val) ((pte_t){ .val = (pte_val) }) +#define __MEMGUARD 0xdeadc0deUL + +#define null_pte ( __mkpte_from(0) ) +#define guard_pte ( __mkpte_from(__MEMGUARD) ) +#define pte_val(pte) ( pte.val ) + + +static inline bool +pte_isguardian(pte_t pte) +{ + return pte.val == __MEMGUARD; +} + +static inline pte_t +mkpte_prot(pte_attr_t prot) +{ + return null_pte; +} + +static inline pte_t +mkpte(ptr_t paddr, pte_attr_t prot) +{ + return null_pte; +} + +static inline pte_t +mkpte_root(ptr_t paddr, pte_attr_t prot) +{ + return null_pte; +} + +static inline pte_t +mkpte_raw(unsigned long pte_val) +{ + return null_pte; +} + +static inline pte_t +pte_setpaddr(pte_t pte, ptr_t paddr) +{ + return pte; +} + +static inline ptr_t +pte_paddr(pte_t pte) +{ + return 0; +} + +static inline pte_t +pte_setprot(pte_t pte, ptr_t prot) +{ + return pte; +} + +static inline pte_attr_t +pte_prot(pte_t pte) +{ + return 0; +} + +static inline bool +pte_isnull(pte_t pte) +{ + return !pte.val; +} + +static inline pte_t +pte_mkhuge(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mkvolatile(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mkroot(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_usepat(pte_t pte) +{ + return pte; +} + +static inline bool +pte_huge(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkloaded(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mkunloaded(pte_t pte) +{ + return pte; +} + +static inline bool +pte_isloaded(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkwprotect(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mkwritable(pte_t pte) +{ + return pte; +} + +static inline bool +pte_iswprotect(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkuser(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mkkernel(pte_t pte) +{ + return pte; +} + +static inline bool +pte_allow_user(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkexec(pte_t pte) +{ + return pte; +} + +static inline pte_t +pte_mknonexec(pte_t pte) +{ + return pte; +} + +static inline bool +pte_isexec(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkuntouch(pte_t pte) +{ + return pte; +} + +static inline bool +pte_istouched(pte_t pte) +{ + return false; +} + +static inline pte_t +pte_mkclean(pte_t pte) +{ + return pte; +} + +static inline bool +pte_dirty(pte_t pte) +{ + return false; +} + +static inline void +set_pte(pte_t* ptep, pte_t pte) +{ + ptep->val = pte.val; +} + +static inline pte_t +pte_at(pte_t* ptep) { + return *ptep; +} + + +#endif /* __LUNAIX_ARCH_PAGETABLE_H */ diff --git a/lunaix-os/arch/i386/boot/archinit.h b/lunaix-os/arch/i386/boot/archinit.h new file mode 100644 index 0000000..b936ca1 --- /dev/null +++ b/lunaix-os/arch/i386/boot/archinit.h @@ -0,0 +1,14 @@ +#ifndef __LUNAIX_ARCHINIT_H +#define __LUNAIX_ARCHINIT_H + +#include +#include +#include + +ptr_t boot_text +kpg_init(); + +struct boot_handoff* boot_text +mb_parse(struct multiboot_info* mb); + +#endif /* __LUNAIX_ARCHINIT_H */ diff --git a/lunaix-os/arch/i386/boot/boot.S b/lunaix-os/arch/i386/boot/boot.S index 9d75d98..2f48bbc 100644 --- a/lunaix-os/arch/i386/boot/boot.S +++ b/lunaix-os/arch/i386/boot/boot.S @@ -13,23 +13,8 @@ /* 根据System V ABI,栈地址必须16字节对齐 */ /* 这里只是一个临时栈,在_hhk_init里面我们会初始化内核专用栈 */ .align 16 - stack_bottom: - .skip 4096, 0 - __stack_top: - - -/* - 1 page directory, - 9 page tables: - 1. Mapping reserved area and hhk_init - 2-9. Remapping the kernels -*/ - -.section .kpg - .global _k_ptd - _k_ptd: - .skip KPG_SIZE, 0 - + .skip 256, 0 + __boot_stack_top: .section .boot.text .global start_ @@ -40,49 +25,14 @@ cld # 确保屏蔽所有外中断,直到我们准备好PIC为止 cli - movl $__stack_top, %esp + movl $__boot_stack_top, %esp subl $16, %esp - /* - parse multiboot struct into arch-agnostic boot info struct - */ - movl %ebx, (%esp) - call mb_parse - - /* - kpg_init用来初始化内核页表: - 1. 初始化最简单的PD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map) - */ - - movl $(KPG_SIZE), 4(%esp) - movl $(_k_ptd - 0xC0000000), (%esp) /* PTD物理地址 */ - call kpg_init - - /* - 基本的映射定义好了,我们可以放心的打开分页了 - 我们只需要把PTD的基地址加载进CR3就好了。 - */ - - /* 加载PTD基地址(物理地址) */ - movl (%esp), %eax - andl $0xfffff000, %eax # 有点多余,但写上还算明白一点 - movl %eax, %cr3 - - movl %cr0, %eax - orl $0x80000000, %eax /* 开启分页与地址转换 (CR0.PG=1, CR0.WP=0) */ - andl $0xfffffffb, %eax - orl $0x2, %eax /* 启用x87 FPU (CR0.MP=1, CR0.EM=0) */ - movl %eax, %cr0 - - movl %cr4, %eax - orl $0x600, %eax - movl %eax, %cr4 /* CR4.OSFXSR=1, CR4.OSXMMEXCPT=1 */ - /* x87 FPU 已配置 */ + call x86_init addl $16, %esp - /* 进入高半核! */ pushl $hhk_entry_ ret \ No newline at end of file diff --git a/lunaix-os/arch/i386/boot/init32.c b/lunaix-os/arch/i386/boot/init32.c new file mode 100644 index 0000000..1b908f8 --- /dev/null +++ b/lunaix-os/arch/i386/boot/init32.c @@ -0,0 +1,17 @@ +#include "archinit.h" +#include +#include + +void boot_text +x86_init(struct multiboot_info* mb) +{ + mb_parse(mb); + + cr4_setfeature(CR4_OSXMMEXCPT | CR4_OSFXSR | CR4_PSE36); + + ptr_t pagetable = kpg_init(); + cpu_chvmspace(pagetable); + + cr0_unsetfeature(CR0_WP | CR0_EM); + cr0_setfeature(CR0_PG | CR0_MP); +} \ No newline at end of file diff --git a/lunaix-os/arch/i386/boot/kpt_setup.c b/lunaix-os/arch/i386/boot/kpt_setup.c index 50d95ee..26a348d 100644 --- a/lunaix-os/arch/i386/boot/kpt_setup.c +++ b/lunaix-os/arch/i386/boot/kpt_setup.c @@ -1,121 +1,105 @@ #define __BOOT_CODE__ -#include +#include +#include #include -#include +#include -#define PT_ADDR(ptd, pt_index) ((ptd_t*)ptd + (pt_index + 1) * 1024) -#define SET_PDE(ptd, pde_index, pde) *((ptd_t*)ptd + pde_index) = pde; -#define SET_PTE(ptd, pt_index, pte_index, pte) \ - *(PT_ADDR(ptd, pt_index) + pte_index) = pte; -#define sym_val(sym) (ptr_t)(&sym) - -#define KERNEL_PAGE_COUNT \ - ((sym_val(__kexec_end) - sym_val(__kexec_start) + 0x1000 - 1) >> 12); -#define HHK_PAGE_COUNT \ - ((sym_val(__kexec_boot_end) - 0x100000 + 0x1000 - 1) >> 12) - -#define V2P(vaddr) ((ptr_t)(vaddr)-KERNEL_EXEC) - -// use table #1 -#define PG_TABLE_IDENTITY 0 +// Provided by linker (see linker.ld) +extern u8_t __kexec_start[]; +extern u8_t __kexec_end[]; +extern u8_t __kexec_text_start[]; +extern u8_t __kexec_text_end[]; +extern u8_t __kboot_start[]; +extern u8_t __kboot_end[]; -// use table #2-8 -// hence the max size of kernel is 8MiB -#define PG_TABLE_KERNEL 1 +// define the initial page table layout +struct kernel_map { + pte_t l0t[_PAGE_LEVEL_SIZE]; -// use table #9 -#define PG_TABLE_STACK 8 + struct { + pte_t _lft[_PAGE_LEVEL_SIZE]; + } kernel_lfts[16]; +} align(4); -// Provided by linker (see linker.ld) -extern u8_t __kexec_start; -extern u8_t __kexec_end; -extern u8_t __kexec_text_start; -extern u8_t __kexec_text_end; +static struct kernel_map kernel_pt __section(".kpg"); +export_symbol(debug, boot, kernel_pt); -extern u8_t __kexec_boot_end; void boot_text -_init_page(x86_page_table* ptd) +_init_page() { - ptd->entry[0] = NEW_L1_ENTRY(PG_PREM_RW, (ptd_t*)ptd + PG_MAX_ENTRIES); - - // 对低1MiB空间进行对等映射(Identity - // mapping),也包括了我们的VGA,方便内核操作。 - x86_page_table* id_pt = - (x86_page_table*)GET_PG_ADDR(ptd->entry[PG_TABLE_IDENTITY]); + struct kernel_map* kpt_pa = (struct kernel_map*)to_kphysical(&kernel_pt); - for (u32_t i = 0; i < 256; i++) { - id_pt->entry[i] = NEW_L2_ENTRY(PG_PREM_RW, (i << PG_SIZE_BITS)); - } + pte_t* kl0tep = (pte_t*) &kpt_pa->l0t[pfn_at(KERNEL_RESIDENT, L0T_SIZE)]; + pte_t* kl1tep = (pte_t*) kpt_pa->kernel_lfts; + pte_t* boot_l0tep = (pte_t*) kpt_pa; - // 对等映射我们的hhk_init,这样一来,当分页与地址转换开启后,我们依然能够照常执行最终的 - // jmp 指令来跳转至 - // 内核的入口点 - for (u32_t i = 0; i < HHK_PAGE_COUNT; i++) { - id_pt->entry[256 + i] = - NEW_L2_ENTRY(PG_PREM_RW, 0x100000 + (i << PG_SIZE_BITS)); - } + set_pte(boot_l0tep, pte_mkhuge(mkpte_prot(KERNEL_DATA))); // --- 将内核重映射至高半区 --- - // 这里是一些计算,主要是计算应当映射进的 页目录 与 页表 的条目索引(Entry - // Index) - u32_t kernel_pde_index = L1_INDEX(sym_val(__kexec_start)); - u32_t kernel_pte_index = L2_INDEX(sym_val(__kexec_start)); - u32_t kernel_pg_counts = KERNEL_PAGE_COUNT; - - // 将内核所需要的页表注册进页目录 - // 当然,就现在而言,我们的内核只占用不到50个页(每个页表包含1024个页) - // 这里分配了3个页表(12MiB),未雨绸缪。 - for (u32_t i = 0; i < PG_TABLE_STACK - PG_TABLE_KERNEL; i++) { - ptd->entry[kernel_pde_index + i] = - NEW_L1_ENTRY(PG_PREM_RW, PT_ADDR(ptd, PG_TABLE_KERNEL + i)); + // Hook the kernel reserved LFTs onto L0T + pte_t pte = mkpte((ptr_t)kl1tep, KERNEL_DATA); + + for (u32_t i = 0; i < KEXEC_RSVD; i++) { + pte = pte_setpaddr(pte, (ptr_t)&kpt_pa->kernel_lfts[i]); + set_pte(kl0tep, pte); + + kl0tep++; } - // 首先,检查内核的大小是否可以fit进我们这几个表(12MiB) - if (kernel_pg_counts > - (PG_TABLE_STACK - PG_TABLE_KERNEL) * PG_MAX_ENTRIES) { + // Ensure the size of kernel is within the reservation + pfn_t kimg_pagecount = + pfn((ptr_t)__kexec_end - (ptr_t)__kexec_start); + if (kimg_pagecount > KEXEC_RSVD * _PAGE_LEVEL_SIZE) { // ERROR: require more pages // here should do something else other than head into blocking asm("ud2"); } - // 计算内核.text段的物理地址 - ptr_t kernel_pm = V2P(&__kexec_start); - ptr_t ktext_start = V2P(&__kexec_text_start); - ptr_t ktext_end = V2P(&__kexec_text_end); + // Now, map the kernel + + pfn_t kimg_end = pfn(to_kphysical(__kexec_end)); + pfn_t i = pfn(to_kphysical(__kexec_text_start)); + kl1tep += i; - // 重映射内核至高半区地址(>=0xC0000000) - for (u32_t i = 0; i < kernel_pg_counts; i++) { - ptr_t paddr = kernel_pm + (i << PG_SIZE_BITS); - u32_t flags = PG_PREM_RW; + // kernel .text + pte = pte_setprot(pte, KERNEL_EXEC); + pfn_t ktext_end = pfn(to_kphysical(__kexec_text_end)); + for (; i < ktext_end; i++) { + pte = pte_setpaddr(pte, page_addr(i)); + set_pte(kl1tep, pte); + + kl1tep++; + } - if (paddr >= ktext_start && paddr <= ktext_end) { - flags = PG_PREM_R; - } + // all remaining kernel sections + pte = pte_setprot(pte, KERNEL_DATA); + for (; i < kimg_end; i++) { + pte = pte_setpaddr(pte, page_addr(i)); + set_pte(kl1tep, pte); - SET_PTE(ptd, - PG_TABLE_KERNEL, - kernel_pte_index + i, - NEW_L2_ENTRY(flags, paddr)) + kl1tep++; } - // 最后一个entry用于循环映射 - ptd->entry[PG_MAX_ENTRIES - 1] = NEW_L1_ENTRY(T_SELF_REF_PERM, ptd); + // XXX: Mapping the kernel .rodata section? + + // Build up self-reference + pte = mkpte_root((ptr_t)kpt_pa, KERNEL_DATA); + set_pte(boot_l0tep + _PAGE_LEVEL_MASK, pte); } -void boot_text -kpg_init(x86_page_table* ptd, u32_t kpg_size) +ptr_t boot_text +kpg_init() { - - // 初始化 kpg 全为0 - // P.s. 真没想到GRUB会在这里留下一堆垃圾! 老子的页表全乱套了! - u8_t* kpg = (u8_t*)ptd; - for (u32_t i = 0; i < kpg_size; i++) { - *(kpg + i) = 0; + ptr_t kmap_pa = to_kphysical(&kernel_pt); + for (size_t i = 0; i < sizeof(kernel_pt); i++) { + ((u8_t*)kmap_pa)[i] = 0; } - _init_page(ptd); + _init_page(); + + return kmap_pa; } \ No newline at end of file diff --git a/lunaix-os/arch/i386/boot/prologue.S b/lunaix-os/arch/i386/boot/prologue.S index ff77ef5..f8d59ce 100644 --- a/lunaix-os/arch/i386/boot/prologue.S +++ b/lunaix-os/arch/i386/boot/prologue.S @@ -3,12 +3,24 @@ #define __ASM__ #include +.section .bss + .align 16 + .skip 2048, 0 + __kinit_stack_top: + # TODO + # This stack was too small that corrupt the ambient kernel structures. + # (took me days to figure this out!) + # We should spent more time to implement a good strategy to detect such + # run-over (we can check these invariants when we trapped in some non-recoverable + # state and provide good feedback to user) + .section .text .global hhk_entry_ hhk_entry_: /* 欢迎来到虚拟内存的世界! :D */ + movl $__kinit_stack_top, %esp andl $stack_alignment, %esp subl $16, %esp /* diff --git a/lunaix-os/arch/i386/exceptions/i386_isrm.c b/lunaix-os/arch/i386/exceptions/i386_isrm.c index 0628535..f1facf9 100644 --- a/lunaix-os/arch/i386/exceptions/i386_isrm.c +++ b/lunaix-os/arch/i386/exceptions/i386_isrm.c @@ -90,7 +90,7 @@ isrm_bindirq(int irq, isr_cb irq_handler) { int iv; if (!(iv = isrm_ivexalloc(irq_handler))) { - panickf("out of IV resource. (irq=%d)", irq); + fail("out of IV resource."); return 0; // never reach } diff --git a/lunaix-os/arch/i386/exceptions/interrupt.S b/lunaix-os/arch/i386/exceptions/interrupt.S index d8df554..e6656c9 100644 --- a/lunaix-os/arch/i386/exceptions/interrupt.S +++ b/lunaix-os/arch/i386/exceptions/interrupt.S @@ -112,11 +112,11 @@ andl $3, %eax jz 1f - ## FIXME x87 fpu context - movl current_thread, %eax - movl thread_ustack_top(%eax), %eax - test %eax, %eax - jz 1f + # # FIXME x87 fpu context + # movl current_thread, %eax + # movl thread_ustack_top(%eax), %eax + # test %eax, %eax + # jz 1f # fxrstor (%eax) 1: diff --git a/lunaix-os/arch/i386/exceptions/interrupts.c b/lunaix-os/arch/i386/exceptions/interrupts.c index 5951236..8e6fa20 100644 --- a/lunaix-os/arch/i386/exceptions/interrupts.c +++ b/lunaix-os/arch/i386/exceptions/interrupts.c @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -50,7 +49,9 @@ intr_handler(isr_param* param) done: - intc_notify_eoi(0, execp->vector); + if (execp->vector > IV_BASE_END) { + intc_notify_eoi(0, execp->vector); + } return; } \ No newline at end of file diff --git a/lunaix-os/arch/i386/includes/sys/crx.h b/lunaix-os/arch/i386/includes/sys/crx.h new file mode 100644 index 0000000..270a897 --- /dev/null +++ b/lunaix-os/arch/i386/includes/sys/crx.h @@ -0,0 +1,52 @@ +#ifndef __LUNAIX_CRX_H +#define __LUNAIX_CRX_H + +#define CR4_PSE36 ( 1UL << 4 ) +#define CR4_OSXMMEXCPT ( 1UL << 10 ) +#define CR4_OSFXSR ( 1UL << 9 ) +#define CR4_PCIDE ( 1UL << 17 ) +#define CR4_PGE ( 1UL << 7 ) +#define CR4_LA57 ( 1UL << 12 ) + +#define CR0_PG ( 1UL << 31 ) +#define CR0_WP ( 1UL << 16 ) +#define CR0_EM ( 1UL << 2 ) +#define CR0_MP ( 1UL << 1 ) + +#define crx_addflag(crx, flag) \ + asm( \ + "movl %%" #crx ", %%eax\n" \ + "orl %0, %%eax\n" \ + "movl %%eax, %%" #crx "\n" \ + ::"r"(flag) \ + :"eax" \ + ); + +#define crx_rmflag(crx, flag) \ + asm( \ + "movl %%" #crx ", %%eax\n" \ + "andl %0, %%eax\n" \ + "movl %%eax, %%" #crx "\n" \ + ::"r"(~(flag)) \ + :"eax" \ + ); + +static inline void +cr4_setfeature(unsigned long feature) +{ + crx_addflag(cr4, feature); +} + +static inline void +cr0_setfeature(unsigned long feature) +{ + crx_addflag(cr0, feature); +} + +static inline void +cr0_unsetfeature(unsigned long feature) +{ + crx_rmflag(cr0, feature); +} + +#endif /* __LUNAIX_CR4_H */ diff --git a/lunaix-os/arch/i386/includes/sys/interrupts.h b/lunaix-os/arch/i386/includes/sys/interrupts.h index a138610..540da4c 100644 --- a/lunaix-os/arch/i386/includes/sys/interrupts.h +++ b/lunaix-os/arch/i386/includes/sys/interrupts.h @@ -7,9 +7,6 @@ #include #include -#define saved_fp(isrm) ((isrm)->registers.ebp) -#define kernel_context(isrm) (!(((isrm)->execp->cs) & 0b11)) - struct exec_param; struct regcontext @@ -50,6 +47,9 @@ struct exec_param u32_t ss; } compact; +#define saved_fp(isrm) ((isrm)->registers.ebp) +#define kernel_context(isrm) (!(((isrm)->execp->cs) & 0b11)) + #endif #endif /* __LUNAIX_INTERRUPTS_H */ diff --git a/lunaix-os/arch/i386/includes/sys/mm/memory.h b/lunaix-os/arch/i386/includes/sys/mm/memory.h new file mode 100644 index 0000000..62bab8d --- /dev/null +++ b/lunaix-os/arch/i386/includes/sys/mm/memory.h @@ -0,0 +1,27 @@ +#ifndef __LUNAIX_MEMORY_H +#define __LUNAIX_MEMORY_H + +#include +#include + +static inline pte_attr_t +translate_vmr_prot(unsigned int vmr_prot) +{ + pte_attr_t _pte_prot = _PTE_U; + if ((vmr_prot & PROT_READ)) { + _pte_prot |= _PTE_R; + } + + if ((vmr_prot & PROT_WRITE)) { + _pte_prot |= _PTE_W; + } + + if ((vmr_prot & PROT_EXEC)) { + _pte_prot |= _PTE_X; + } + + return _pte_prot; +} + + +#endif /* __LUNAIX_MEMORY_H */ diff --git a/lunaix-os/arch/i386/includes/sys/mm/mempart.h b/lunaix-os/arch/i386/includes/sys/mm/mempart.h index 0ffaad1..d923d45 100644 --- a/lunaix-os/arch/i386/includes/sys/mm/mempart.h +++ b/lunaix-os/arch/i386/includes/sys/mm/mempart.h @@ -25,33 +25,33 @@ #define USR_STACK_SIZE 0x40000UL #define USR_STACK_END 0xbffffff0UL -#define KERNEL_EXEC 0xc0000000UL -#define KERNEL_EXEC_SIZE 0x4000000UL -#define KERNEL_EXEC_END 0xc3ffffffUL +#define KERNEL_IMG 0xc0000000UL +#define KERNEL_IMG_SIZE 0x4000000UL +#define KERNEL_IMG_END 0xc3ffffffUL -#define VMS_MOUNT_1 0xc4000000UL -#define VMS_MOUNT_1_SIZE 0x400000UL -#define VMS_MOUNT_1_END 0xc43fffffUL - -#define PG_MOUNT_1 0xc4400000UL +#define PG_MOUNT_1 0xc4000000UL #define PG_MOUNT_1_SIZE 0x1000UL -#define PG_MOUNT_1_END 0xc4400fffUL +#define PG_MOUNT_1_END 0xc4000fffUL -#define PG_MOUNT_2 0xc4401000UL +#define PG_MOUNT_2 0xc4001000UL #define PG_MOUNT_2_SIZE 0x1000UL -#define PG_MOUNT_2_END 0xc4401fffUL +#define PG_MOUNT_2_END 0xc4001fffUL -#define PG_MOUNT_3 0xc4402000UL +#define PG_MOUNT_3 0xc4002000UL #define PG_MOUNT_3_SIZE 0x1000UL -#define PG_MOUNT_3_END 0xc4402fffUL +#define PG_MOUNT_3_END 0xc4002fffUL -#define PG_MOUNT_4 0xc4403000UL +#define PG_MOUNT_4 0xc4003000UL #define PG_MOUNT_4_SIZE 0x1000UL -#define PG_MOUNT_4_END 0xc4403fffUL +#define PG_MOUNT_4_END 0xc4003fffUL -#define VMAP 0xc4800000UL +#define VMAP 0xc4400000UL #define VMAP_SIZE 0x3b400000UL -#define VMAP_END 0xffbfffffUL +#define VMAP_END 0xff7fffffUL + +#define VMS_MOUNT_1 0xff800000UL +#define VMS_MOUNT_1_SIZE 0x400000UL +#define VMS_MOUNT_1_END 0xffbfffffUL #define PD_REF 0xffc00000UL #define PD_REF_SIZE 0x400000UL diff --git a/lunaix-os/arch/i386/includes/sys/mm/mm_defs.h b/lunaix-os/arch/i386/includes/sys/mm/mm_defs.h index 8f51352..8dd7df6 100644 --- a/lunaix-os/arch/i386/includes/sys/mm/mm_defs.h +++ b/lunaix-os/arch/i386/includes/sys/mm/mm_defs.h @@ -2,12 +2,32 @@ #define __LUNAIX_MM_DEFS_H #include "mempart.h" +#include "pagetable.h" -#define KSTACK_SIZE (3 * MEM_PAGE) +#define KSTACK_PAGES 3 +#define KSTACK_SIZE (KSTACK_PAGES * MEM_PAGE) -#define MEMGUARD 0xdeadc0deUL +/* + Regardless architecture we need to draw the line very carefully, and must + take the size of VM into account. In general, we aims to achieve + "sufficiently large" of memory for kernel -#define kernel_addr(addr) ((addr) >= KERNEL_EXEC) -#define guardian_page(pte) ((pte) == MEMGUARD) + In terms of x86_32: + * #768~1022 PTEs of PD (0x00000000c0000000, ~1GiB) + + In light of upcomming x86_64 support (for Level 4&5 Paging): + * #510 entry of PML4 (0x0000ff0000000000, ~512GiB) + * #510 entry of PML5 (0x01fe000000000000, ~256TiB) +*/ +// Where the kernel getting re-mapped. +#define KERNEL_RESIDENT 0xc0000000UL + +// Pages reserved for kernel image +#define KEXEC_RSVD 16 + +#define kernel_addr(addr) ((addr) >= KERNEL_RESIDENT || (addr) < USR_EXEC) + +#define to_kphysical(k_va) ((ptr_t)(k_va) - KERNEL_RESIDENT) +#define to_kvirtual(k_pa) ((ptr_t)(k_pa) - KERNEL_RESIDENT) #endif /* __LUNAIX_MM_DEFS_H */ diff --git a/lunaix-os/arch/i386/includes/sys/mm/pagetable.h b/lunaix-os/arch/i386/includes/sys/mm/pagetable.h new file mode 100644 index 0000000..4fd9439 --- /dev/null +++ b/lunaix-os/arch/i386/includes/sys/mm/pagetable.h @@ -0,0 +1,315 @@ +#ifndef __LUNAIX_ARCH_PAGETABLE_H +#define __LUNAIX_ARCH_PAGETABLE_H + +#include +#include + +/* ******** Page Table Manipulation ******** */ + +// Levels of page table to traverse for a single page walk +#define _PTW_LEVEL 2 + +#define _PAGE_BASE_SHIFT 12 +#define _PAGE_BASE_SIZE ( 1UL << _PAGE_BASE_SHIFT ) +#define _PAGE_BASE_MASK ( _PAGE_BASE_SIZE - 1) + +#define _PAGE_LEVEL_SHIFT 10 +#define _PAGE_LEVEL_SIZE ( 1UL << _PAGE_LEVEL_SHIFT ) +#define _PAGE_LEVEL_MASK ( _PAGE_LEVEL_SIZE - 1 ) +#define _PAGE_Ln_SIZE(n) ( 1UL << (_PAGE_BASE_SHIFT + _PAGE_LEVEL_SHIFT * (_PTW_LEVEL - (n) - 1)) ) + +// Note: we set VMS_SIZE = VMS_MASK as it is impossible +// to express 4Gi in 32bit unsigned integer + +#define VMS_MASK ( -1UL ) +#define VMS_SIZE VMS_MASK + +/* General size of a LnT huge page */ + +#define L0T_SIZE _PAGE_Ln_SIZE(0) +#define L1T_SIZE _PAGE_Ln_SIZE(1) +#define L2T_SIZE _PAGE_Ln_SIZE(1) +#define L3T_SIZE _PAGE_Ln_SIZE(1) +#define LFT_SIZE _PAGE_Ln_SIZE(1) + +/* General mask to get page offset of a LnT huge page */ + +#define L0T_MASK ( L0T_SIZE - 1 ) +#define L1T_MASK ( L1T_SIZE - 1 ) +#define L2T_MASK ( L2T_SIZE - 1 ) +#define L3T_MASK ( L3T_SIZE - 1 ) +#define LFT_MASK ( LFT_SIZE - 1 ) + +/* Masks to get index of a LnTE */ + +#define L0T_INDEX_MASK ( VMS_MASK ^ L0T_MASK ) +#define L1T_INDEX_MASK ( L0T_MASK ^ L1T_MASK ) +#define L2T_INDEX_MASK ( L1T_MASK ^ L2T_MASK ) +#define L3T_INDEX_MASK ( L2T_MASK ^ L3T_MASK ) +#define LFT_INDEX_MASK ( L3T_MASK ^ LFT_MASK ) + +#define PAGE_SHIFT _PAGE_BASE_SHIFT +#define PAGE_SIZE _PAGE_BASE_SIZE +#define PAGE_MASK _PAGE_BASE_MASK + +#define LEVEL_SHIFT _PAGE_LEVEL_SHIFT +#define LEVEL_SIZE _PAGE_LEVEL_SIZE +#define LEVEL_MASK _PAGE_LEVEL_MASK + +// max PTEs number +#define MAX_PTEN _PAGE_LEVEL_SIZE + +// max translation level supported +#define MAX_LEVEL _PTW_LEVEL + + +/* ******** PTE Manipulation ******** */ + +struct __pte { + unsigned int val; +} align(4); + +#ifndef pte_t +typedef struct __pte pte_t; +#endif + +typedef unsigned int pfn_t; +typedef unsigned int pte_attr_t; + +#define _PTE_P (1 << 0) +#define _PTE_W (1 << 1) +#define _PTE_U (1 << 2) +#define _PTE_WT (1 << 3) +#define _PTE_CD (1 << 4) +#define _PTE_A (1 << 5) +#define _PTE_D (1 << 6) +#define _PTE_PS (1 << 7) +#define _PTE_PAT (1 << 7) +#define _PTE_G (1 << 8) +#define _PTE_X (0) +#define _PTE_R (0) + +#define _PTE_PROT_MASK ( _PTE_W | _PTE_U | _PTE_X ) + +#define KERNEL_PAGE ( _PTE_P ) +#define KERNEL_EXEC ( KERNEL_PAGE | _PTE_X ) +#define KERNEL_DATA ( KERNEL_PAGE | _PTE_W ) +#define KERNEL_RDONLY ( KERNEL_PAGE ) + +#define USER_PAGE ( _PTE_P | _PTE_U ) +#define USER_EXEC ( USER_PAGE | _PTE_X ) +#define USER_DATA ( USER_PAGE | _PTE_W ) +#define USER_RDONLY ( USER_PAGE ) + +#define SELF_MAP ( KERNEL_DATA | _PTE_WT | _PTE_CD ) + +#define __mkpte_from(pte_val) ((pte_t){ .val = (pte_val) }) +#define __MEMGUARD 0xdeadc0deUL + +#define null_pte ( __mkpte_from(0) ) +#define guard_pte ( __mkpte_from(__MEMGUARD) ) +#define pte_val(pte) ( pte.val ) + + +static inline bool +pte_isguardian(pte_t pte) +{ + return pte.val == __MEMGUARD; +} + +static inline pte_t +mkpte_prot(pte_attr_t prot) +{ + pte_attr_t attrs = (prot & _PTE_PROT_MASK) | _PTE_P; + return __mkpte_from(attrs); +} + +static inline pte_t +mkpte(ptr_t paddr, pte_attr_t prot) +{ + pte_attr_t attrs = (prot & _PTE_PROT_MASK) | _PTE_P; + return __mkpte_from((paddr & ~_PAGE_BASE_MASK) | attrs); +} + +static inline pte_t +mkpte_root(ptr_t paddr, pte_attr_t prot) +{ + pte_attr_t attrs = (prot & _PTE_PROT_MASK) | _PTE_P; + return __mkpte_from((paddr & ~_PAGE_BASE_MASK) | attrs); +} + +static inline pte_t +mkpte_raw(unsigned long pte_val) +{ + return __mkpte_from(pte_val); +} + +static inline pte_t +pte_setpaddr(pte_t pte, ptr_t paddr) +{ + return __mkpte_from((pte.val & _PAGE_BASE_MASK) | (paddr & ~_PAGE_BASE_MASK)); +} + +static inline ptr_t +pte_paddr(pte_t pte) +{ + return pte.val & ~_PAGE_BASE_MASK; +} + +static inline pte_t +pte_setprot(pte_t pte, ptr_t prot) +{ + return __mkpte_from((pte.val & ~_PTE_PROT_MASK) | (prot & _PTE_PROT_MASK)); +} + +static inline pte_attr_t +pte_prot(pte_t pte) +{ + return (pte.val & _PTE_PROT_MASK); +} + +static inline bool +pte_isnull(pte_t pte) +{ + return !pte.val; +} + +static inline pte_t +pte_mkhuge(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_PS); +} + +static inline pte_t +pte_mkvolatile(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_WT | _PTE_CD); +} + +static inline pte_t +pte_mkroot(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_PS); +} + +static inline pte_t +pte_usepat(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_PAT); +} + +static inline bool +pte_huge(pte_t pte) +{ + return !!(pte.val & _PTE_PS); +} + +static inline pte_t +pte_mkloaded(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_P); +} + +static inline pte_t +pte_mkunloaded(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_P); +} + +static inline bool +pte_isloaded(pte_t pte) +{ + return !!(pte.val & _PTE_P); +} + +static inline pte_t +pte_mkwprotect(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_W); +} + +static inline pte_t +pte_mkwritable(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_W); +} + +static inline bool +pte_iswprotect(pte_t pte) +{ + return !(pte.val & _PTE_W); +} + +static inline pte_t +pte_mkuser(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_U); +} + +static inline pte_t +pte_mkkernel(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_U); +} + +static inline bool +pte_allow_user(pte_t pte) +{ + return !!(pte.val & _PTE_U); +} + +static inline pte_t +pte_mkexec(pte_t pte) +{ + return __mkpte_from(pte.val | _PTE_X); +} + +static inline pte_t +pte_mknonexec(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_X); +} + +static inline bool +pte_isexec(pte_t pte) +{ + return !!(pte.val & _PTE_X); +} + +static inline pte_t +pte_mkuntouch(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_A); +} + +static inline bool +pte_istouched(pte_t pte) +{ + return !!(pte.val & _PTE_A); +} + +static inline pte_t +pte_mkclean(pte_t pte) +{ + return __mkpte_from(pte.val & ~_PTE_D); +} + +static inline bool +pte_dirty(pte_t pte) +{ + return !!(pte.val & _PTE_D); +} + +static inline void +set_pte(pte_t* ptep, pte_t pte) +{ + ptep->val = pte.val; +} + +static inline pte_t +pte_at(pte_t* ptep) { + return *ptep; +} + + +#endif /* __LUNAIX_ARCH_PAGETABLE_H */ diff --git a/lunaix-os/arch/i386/mm/fault.c b/lunaix-os/arch/i386/mm/fault.c new file mode 100644 index 0000000..44f01a6 --- /dev/null +++ b/lunaix-os/arch/i386/mm/fault.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +#include + +bool +__arch_prepare_fault_context(struct fault_context* fault) +{ + isr_param* ictx = fault->ictx; + + ptr_t ptr = cpu_ldeaddr(); + if (!ptr) { + return false; + } + + fault->fault_ptep = mkptep_va(VMS_SELF, ptr); + fault->fault_data = ictx->execp->err_code; + fault->fault_instn = ictx->execp->eip; + fault->fault_va = ptr; + + return true; +} \ No newline at end of file diff --git a/lunaix-os/arch/i386/mm/pfault.c b/lunaix-os/arch/i386/mm/pfault.c deleted file mode 100644 index d0dd56c..0000000 --- a/lunaix-os/arch/i386/mm/pfault.c +++ /dev/null @@ -1,170 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -LOG_MODULE("pf") - - - -#define COW_MASK (REGION_RSHARED | REGION_READ | REGION_WRITE) - -extern void -__print_panic_msg(const char* msg, const isr_param* param); - -void -intr_routine_page_fault(const isr_param* param) -{ - if (param->depth > 10) { - // Too many nested fault! we must messed up something - // XXX should we failed silently? - spin(); - } - - uint32_t errcode = param->execp->err_code; - ptr_t ptr = cpu_ldeaddr(); - if (!ptr) { - goto segv_term; - } - - v_mapping mapping; - if (!vmm_lookup(ptr, &mapping)) { - goto segv_term; - } - - // XXX do kernel trigger pfault? - - volatile x86_pte_t* pte = &PTE_MOUNTED(VMS_SELF, ptr >> 12); - - if (guardian_page(*pte)) { - ERROR("memory region over-running"); - goto segv_term; - } - - vm_regions_t* vmr = vmregions(__current); - struct mm_region* hit_region = region_get(vmr, ptr); - - if (!hit_region) { - // 当你凝视深渊时…… - goto segv_term; - } - - if (PG_IS_PRESENT(*pte)) { - if (((errcode ^ mapping.flags) & PG_ALLOW_USER)) { - // invalid access - DEBUG("invalid user access. (%p->%p, attr:0x%x)", - mapping.va, - mapping.pa, - mapping.flags); - goto segv_term; - } - if ((hit_region->attr & COW_MASK) == COW_MASK) { - // normal page fault, do COW - cpu_flush_page((ptr_t)pte); - - ptr_t pa = (ptr_t)vmm_dup_page(PG_ENTRY_ADDR(*pte)); - - pmm_free_page(*pte & ~0xFFF); - *pte = (*pte & 0xFFF & ~PG_DIRTY) | pa | PG_WRITE; - - goto resolved; - } - // impossible cases or accessing privileged page - goto segv_term; - } - - // an anonymous page and not present - // -> a new page need to be alloc - if ((hit_region->attr & REGION_ANON)) { - if (!PG_IS_PRESENT(*pte)) { - cpu_flush_page((ptr_t)pte); - - ptr_t pa = pmm_alloc_page(0); - if (!pa) { - goto oom; - } - - *pte = pa | region_ptattr(hit_region); - memset((void*)PG_ALIGN(ptr), 0, PG_SIZE); - goto resolved; - } - // permission denied on anon page (e.g., write on readonly page) - goto segv_term; - } - - // if mfile is set (Non-anonymous), then it is a mem map - if (hit_region->mfile && !PG_IS_PRESENT(*pte)) { - struct v_file* file = hit_region->mfile; - - ptr = PG_ALIGN(ptr); - - u32_t mseg_off = (ptr - hit_region->start); - u32_t mfile_off = mseg_off + hit_region->foff; - ptr_t pa = pmm_alloc_page(0); - - if (!pa) { - goto oom; - } - - cpu_flush_page((ptr_t)pte); - *pte = pa | region_ptattr(hit_region); - - memset((void*)ptr, 0, PG_SIZE); - - int errno = file->ops->read_page(file->inode, (void*)ptr, mfile_off); - - if (errno < 0) { - ERROR("fail to populate page (%d)", errno); - goto segv_term; - } - - *pte &= ~PG_DIRTY; - - goto resolved; - } - - // page not present, might be a chance to introduce swap file? - __print_panic_msg("WIP page fault route", param); - while (1) - ; - -oom: - ERROR("out of memory"); - -segv_term: - ERROR("(pid: %d) Segmentation fault on %p (%p:%p,e=0x%x)", - __current->pid, - ptr, - param->execp->cs, - param->execp->eip, - param->execp->err_code); - - trace_printstack_isr(param); - - if (kernel_context(param)) { - ERROR("[page fault on kernel]"); - // halt kernel if segv comes from kernel space - spin(); - } - - thread_setsignal(current_thread, _SIGSEGV); - - schedule(); - // should not reach - while (1) - ; - -resolved: - cpu_flush_page(ptr); - return; -} \ No newline at end of file diff --git a/lunaix-os/arch/i386/mm/vmutils.c b/lunaix-os/arch/i386/mm/vmutils.c new file mode 100644 index 0000000..d7a98ea --- /dev/null +++ b/lunaix-os/arch/i386/mm/vmutils.c @@ -0,0 +1,23 @@ +#include +#include +#include + +ptr_t +vmm_dup_page(ptr_t pa) +{ + ptr_t new_ppg = pmm_alloc_page(0); + mount_page(PG_MOUNT_3, new_ppg); + mount_page(PG_MOUNT_4, pa); + + asm volatile("movl %1, %%edi\n" + "movl %2, %%esi\n" + "rep movsl\n" ::"c"(1024), + "r"(PG_MOUNT_3), + "r"(PG_MOUNT_4) + : "memory", "%edi", "%esi"); + + unmount_page(PG_MOUNT_3); + unmount_page(PG_MOUNT_4); + + return new_ppg; +} \ No newline at end of file diff --git a/lunaix-os/arch/i386/pcontext.c b/lunaix-os/arch/i386/pcontext.c index a0ff6a6..6b56b41 100644 --- a/lunaix-os/arch/i386/pcontext.c +++ b/lunaix-os/arch/i386/pcontext.c @@ -13,17 +13,17 @@ volatile struct x86_tss _tss = { .link = 0, bool inject_transfer_context(ptr_t vm_mnt, struct transfer_context* tctx) { - v_mapping mapping; - if (!vmm_lookupat(vm_mnt, tctx->inject, &mapping)) { + pte_t pte; + if (!vmm_lookupat(vm_mnt, tctx->inject, &pte)) { return false; } - vmm_mount_pg(PG_MOUNT_4, mapping.pa); + mount_page(PG_MOUNT_4, pte_paddr(pte)); - ptr_t mount_inject = PG_MOUNT_4 + PG_OFFSET(tctx->inject); + ptr_t mount_inject = PG_MOUNT_4 + va_offset(tctx->inject); memcpy((void*)mount_inject, &tctx->transfer, sizeof(tctx->transfer)); - vmm_unmount_pg(PG_MOUNT_4); + unmount_page(PG_MOUNT_4); return true; } diff --git a/lunaix-os/hal/char/devnull.c b/lunaix-os/hal/char/devnull.c index 410f3ba..77650b0 100644 --- a/lunaix-os/hal/char/devnull.c +++ b/lunaix-os/hal/char/devnull.c @@ -1,11 +1,11 @@ #include -#include +#include static int __null_wr_pg(struct device* dev, void* buf, size_t offset) { // do nothing - return PG_SIZE; + return PAGE_SIZE; } static int diff --git a/lunaix-os/hal/char/devzero.c b/lunaix-os/hal/char/devzero.c index 77885d7..9013a47 100644 --- a/lunaix-os/hal/char/devzero.c +++ b/lunaix-os/hal/char/devzero.c @@ -1,13 +1,13 @@ #include -#include +#include #include static int __zero_rd_pg(struct device* dev, void* buf, size_t offset) { - memset(&((u8_t*)buf)[offset], 0, PG_SIZE); - return PG_SIZE; + memset(&((u8_t*)buf)[offset], 0, PAGE_SIZE); + return PAGE_SIZE; } static int diff --git a/lunaix-os/hal/char/lxconsole.c b/lunaix-os/hal/char/lxconsole.c index 53d01bb..6387670 100644 --- a/lunaix-os/hal/char/lxconsole.c +++ b/lunaix-os/hal/char/lxconsole.c @@ -99,13 +99,13 @@ done: int __tty_write_pg(struct device* dev, void* buf, size_t offset) { - return __tty_write(dev, buf, offset, PG_SIZE); + return __tty_write(dev, buf, offset, PAGE_SIZE); } int __tty_read_pg(struct device* dev, void* buf, size_t offset) { - return __tty_read(dev, buf, offset, PG_SIZE); + return __tty_read(dev, buf, offset, PAGE_SIZE); } int diff --git a/lunaix-os/hal/rng/rngx86.c b/lunaix-os/hal/rng/rngx86.c index 0b8a586..b108740 100644 --- a/lunaix-os/hal/rng/rngx86.c +++ b/lunaix-os/hal/rng/rngx86.c @@ -1,5 +1,5 @@ #include -#include +#include #include @@ -19,8 +19,8 @@ rng_fill(void* data, size_t len) static int __rand_rd_pg(struct device* dev, void* buf, size_t offset) { - rng_fill(buf, PG_SIZE); - return PG_SIZE; + rng_fill(buf, PAGE_SIZE); + return PAGE_SIZE; } static int diff --git a/lunaix-os/includes/lunaix/compiler.h b/lunaix-os/includes/lunaix/compiler.h index c3eab58..a0b8374 100644 --- a/lunaix-os/includes/lunaix/compiler.h +++ b/lunaix-os/includes/lunaix/compiler.h @@ -1,30 +1,32 @@ #ifndef __LUNAIX_COMPILER_H #define __LUNAIX_COMPILER_H -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) - -#define weak_alias(name) __attribute__((weak, alias(name))) -#define weak __attribute__((weak)) -#define noret __attribute__((noreturn)) -#define optimize(opt) __attribute__((optimize(opt))) -#define must_inline __attribute__((always_inline)) -#define must_emit __attribute__((used)) -#define unreachable __builtin_unreachable() - -#define clz(bits) __builtin_clz(bits) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + +#define __section(name) __attribute__((section(name))) +#define weak_alias(name) __attribute__((weak, alias(name))) +#define optimize(opt) __attribute__((optimize(opt))) +#define weak __attribute__((weak)) +#define noret __attribute__((noreturn)) +#define must_inline __attribute__((always_inline)) +#define must_emit __attribute__((used)) +#define unreachable __builtin_unreachable() +#define no_inline __attribute__((noinline)) + +#define clz(bits) __builtin_clz(bits) #define sadd_overflow(a, b, of) __builtin_sadd_overflow(a, b, of) #define umul_overflow(a, b, of) __builtin_umul_overflow(a, b, of) -#define offsetof(f, m) __builtin_offsetof(f, m) +#define offsetof(f, m) __builtin_offsetof(f, m) -#define prefetch_rd(ptr, ll) __builtin_prefetch((ptr), 0, ll) -#define prefetch_wr(ptr, ll) __builtin_prefetch((ptr), 1, ll) +#define prefetch_rd(ptr, ll) __builtin_prefetch((ptr), 0, ll) +#define prefetch_wr(ptr, ll) __builtin_prefetch((ptr), 1, ll) #define stringify(v) #v #define stringify__(v) stringify(v) -#define compact __attribute__((packed)) -#define align(v) __attribute__((aligned (v))) +#define compact __attribute__((packed)) +#define align(v) __attribute__((aligned (v))) #define export_symbol(domain, namespace, symbol)\ typeof(symbol)* must_emit __SYMEXPORT_Z##domain##_N##namespace##_S##symbol = &(symbol) diff --git a/lunaix-os/includes/lunaix/mm/fault.h b/lunaix-os/includes/lunaix/mm/fault.h new file mode 100644 index 0000000..77aab84 --- /dev/null +++ b/lunaix-os/includes/lunaix/mm/fault.h @@ -0,0 +1,49 @@ +#ifndef __LUNAIX_FAULT_H +#define __LUNAIX_FAULT_H + +#include +#include +#include + +#define RESOLVE_OK ( 0b000001 ) +#define NO_PREALLOC ( 0b000010 ) + +struct fault_context +{ + isr_param* ictx; + + struct + { + pte_t* fault_ptep; + ptr_t fault_va; + ptr_t fault_data; + ptr_t fault_instn; + }; // arch-dependent fault state + + pte_t fault_pte; // the fault-causing pte + ptr_t fault_refva; // referneced va, for ptep fault, equals to fault_va otherwise + pte_t resolving; // the pte that will resolve the fault + + ptr_t prealloc_pa; // preallocated physical page in-case of empty fault-pte + + bool kernel_vmfault:1; // faulting address that is kernel + bool ptep_fault:1; // faulting address is a ptep + bool remote_fault:1; // referenced faulting address is remote vms + bool kernel_access:1; // kernel mem access causing the fault + + struct proc_mm* mm; // process memory space associated with fault, might be remote + struct mm_region* vmr; + + int resolve_type; +}; + +bool +__arch_prepare_fault_context(struct fault_context* context); + +static inline void +fault_resolved(struct fault_context* fault, pte_t resolved, int flags) +{ + fault->resolving = resolved; + fault->resolve_type |= (flags | RESOLVE_OK); +} +#endif /* __LUNAIX_FAULT_H */ diff --git a/lunaix-os/includes/lunaix/mm/mm.h b/lunaix-os/includes/lunaix/mm/mm.h index 31954d3..d5b8edd 100644 --- a/lunaix-os/includes/lunaix/mm/mm.h +++ b/lunaix-os/includes/lunaix/mm/mm.h @@ -2,6 +2,9 @@ #define __LUNAIX_MM_H #include +#include + +#include #include @@ -42,4 +45,30 @@ #define REGION_TYPE_STACK (4 << 16) #define REGION_TYPE_VARS (5 << 16) +struct mm_region +{ + struct llist_header head; // must be first field! + struct proc_mm* proc_vms; + + // file mapped to this region + struct v_file* mfile; + // mapped file offset + off_t foff; + // mapped file length + u32_t flen; // XXX it seems that we don't need this actually.. + + ptr_t start; + ptr_t end; + u32_t attr; + + void** index; // fast reference, to accelerate access to this very region. + + void* data; + // when a region is copied + void (*region_copied)(struct mm_region*); + // when a region is unmapped + void (*destruct_region)(struct mm_region*); +}; + + #endif /* __LUNAIX_MM_H */ diff --git a/lunaix-os/includes/lunaix/mm/page.h b/lunaix-os/includes/lunaix/mm/page.h deleted file mode 100644 index c28cca0..0000000 --- a/lunaix-os/includes/lunaix/mm/page.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef __LUNAIX_PAGE_H -#define __LUNAIX_PAGE_H -#include - -#define PG_SIZE_BITS 12 -#define PG_SIZE (1 << PG_SIZE_BITS) - -#define PG_MAX_ENTRIES 1024U -#define PG_LAST_TABLE PG_MAX_ENTRIES - 1 -#define PG_FIRST_TABLE 0 - -#define PTE_NULL 0 - -#define PG_ALIGN(addr) ((ptr_t)(addr)&0xFFFFF000UL) -#define PG_MOD(addr) ((ptr_t)(addr) & (PG_SIZE - 1)) -#define PG_ALIGNED(addr) (!((ptr_t)(addr)&0x00000FFFUL)) -#define PN(addr) (((ptr_t)(addr) >> 12)) - -#define L1_INDEX(vaddr) (u32_t)(((ptr_t)(vaddr)&0xFFC00000UL) >> 22) -#define L2_INDEX(vaddr) (u32_t)(((ptr_t)(vaddr)&0x003FF000UL) >> 12) -#define PG_OFFSET(vaddr) (u32_t)((ptr_t)(vaddr)&0x00000FFFUL) - -#define GET_PT_ADDR(pde) PG_ALIGN(pde) -#define GET_PG_ADDR(pte) PG_ALIGN(pte) - -#define IS_CACHED(entry) ((entry & 0x1)) - -#define PG_PRESENT (0x1) -#define PG_DIRTY (1 << 6) -#define PG_ACCESSED (1 << 5) -#define PG_WRITE (0x1 << 1) -#define PG_ALLOW_USER (0x1 << 2) -#define PG_WRITE_THROUGH (1 << 3) -#define PG_DISABLE_CACHE (1 << 4) -#define PG_PDE_4MB (1 << 7) - -#define PG_IS_DIRTY(pte) ((pte)&PG_DIRTY) -#define PG_IS_ACCESSED(pte) ((pte)&PG_ACCESSED) -#define PG_IS_PRESENT(pte) ((pte)&PG_PRESENT) - -#define NEW_L1_ENTRY(flags, pt_addr) \ - (PG_ALIGN(pt_addr) | (((flags) | PG_WRITE_THROUGH) & 0xfff)) -#define NEW_L2_ENTRY(flags, pg_addr) (PG_ALIGN(pg_addr) | ((flags)&0xfff)) - -#define V_ADDR(pd, pt, offset) ((pd) << 22 | (pt) << 12 | (offset)) -#define P_ADDR(ppn, offset) ((ppn << 12) | (offset)) - -#define PG_ENTRY_FLAGS(entry) ((entry)&0xFFFU) -#define PG_ENTRY_ADDR(entry) ((entry) & ~0xFFFU) - -#define HAS_FLAGS(entry, flags) ((PG_ENTRY_FLAGS(entry) & (flags)) == flags) -#define CONTAINS_FLAGS(entry, flags) (PG_ENTRY_FLAGS(entry) & (flags)) - -#define PG_PREM_R (PG_PRESENT) -#define PG_PREM_RW (PG_PRESENT | PG_WRITE) -#define PG_PREM_UR (PG_PRESENT | PG_ALLOW_USER) -#define PG_PREM_URW (PG_PRESENT | PG_WRITE | PG_ALLOW_USER) - -// 用于对PD进行循环映射,因为我们可能需要对PD进行频繁操作,我们在这里禁用TLB缓存 -#define T_SELF_REF_PERM PG_PREM_RW | PG_DISABLE_CACHE | PG_WRITE_THROUGH - -// 页目录的虚拟基地址,可以用来访问到各个PDE -#define L1_BASE_VADDR 0xFFFFF000U - -// 页表的虚拟基地址,可以用来访问到各个PTE -#define L2_BASE_VADDR 0xFFC00000U - -// 用来获取特定的页表的虚拟地址 -#define L2_VADDR(pd_offset) (L2_BASE_VADDR | (pd_offset << 12)) - -typedef unsigned long ptd_t; -typedef unsigned long pt_t; -typedef unsigned int pt_attr; -typedef u32_t x86_pte_t; - -/** - * @brief 虚拟映射属性 - * - */ -typedef struct -{ - // 虚拟页地址 - ptr_t va; - // 物理页码(如果不存在映射,则为0) - u32_t pn; - // 物理页地址(如果不存在映射,则为0) - ptr_t pa; - // 映射的flags - u16_t flags; - // PTE地址 - x86_pte_t* pte; -} v_mapping; - -typedef struct -{ - x86_pte_t entry[PG_MAX_ENTRIES]; -} __attribute__((packed, aligned(4))) x86_page_table; - -/* 四个页挂载点,两个页目录挂载点: 用于临时创建&编辑页表 */ -#define PG_MOUNT_RANGE(l1_index) (701 <= l1_index && l1_index <= 703) - -/* - 当前进程内存空间挂载点 -*/ -#define VMS_SELF L2_BASE_VADDR - -#define PTE_MOUNTED(mnt, vpn) \ - (((x86_page_table*)((mnt) | (((vpn)&0xffc00) << 2)))->entry[(vpn)&0x3ff]) - -#endif /* __LUNAIX_PAGE_H */ diff --git a/lunaix-os/includes/lunaix/mm/pagetable.h b/lunaix-os/includes/lunaix/mm/pagetable.h new file mode 100644 index 0000000..4c2fce5 --- /dev/null +++ b/lunaix-os/includes/lunaix/mm/pagetable.h @@ -0,0 +1,507 @@ +#ifndef __LUNAIX_PAGETABLE_H +#define __LUNAIX_PAGETABLE_H + +/* + Defines page related attributes for different page table + hierarchies. In Lunaix, we define five arch-agnostic alias + to those arch-dependent hierarchies: + + + L0T: Level-0 Table, the root page table + + L1T: Level-1 Table, indexed by L0P entries + + L2T: Level-2 Table, indexed by L1P entries + + L3T: Level-3 Table, indexed by L2P entries + + LFT: Leaf-Level Table (Level-4), indexed by L3P entries + + Therefore, "LnTE" can be used to refer "Entry in a Level-n Table". + Consequently, we can further define + + + LnTEP - pointer to an entry within LnT + + LnTP - pointer to (the first entry of) LnT + + To better identify all derived value from virtual and physical + adress, we defines: + + + Virtual Address Space (VAS): + A set of all virtual addresses that can be interpreted + by page table walker. + + + Virtual Mappings Space (VMS): + A imaginary linear table compose a set of mappings that + define the translation rules from virtual memory address + space to physical memory address. (Note: mappings are stored + in the hierarchy of page tables, however it is transparent, + just as indexing into a big linear table, thus 'imaginary') + A VMS is a realisation of a VAS. + + + Virtual Mappings Mounting (VM_MNT or MNT): + A subregion within current VAS for where the VA/PA mappings + of another VMS are accessible. + + + Page Frame Number (PFN): + Index of a page with it's base size. For most machine, it + is 4K. Note, this is not limited to physical address, for + virtual address, this is the index of a virtual page within + it's VMS. + + + Virtual Frame Number (VFN): + Index of a virtual page within it's parent page table. It's + range is bounded aboved by maximium number of PTEs per page + table + + In the context of x86 archiecture (regardless x86_32 or x86_64), + these naming have the following realisations: + + + L0T: PD (32-Bit 2-Level paging) + PML4 (4-Level Paging) + PML5 (5-Level Paging) + + + L1T: ( N/A ) (32-Bit 2-Level paging) + PDP (4-Level Paging) + PML4 (5-Level Paging) + + + L2T: ( N/A ) (32-Bit 2-Level paging) + PD (4-Level Paging) + PDP (5-Level Paging) + + + L3T: ( N/A ) (32-Bit 2-Level paging) + ( N/A ) (4-Level Paging) + PD (5-Level Paging) + + + LFT: Page Table (All) + + + VAS: + [0, 2^32) (32-Bit 2-Level paging) + [0, 2^48) (4-Level Paging) + [0, 2^57) (5-Level Paging) + + + PFN (Vitrual): + [0, 2^22) (32-Bit 2-Level paging) + [0, 2^36) (4-Level Paging) + [0, 2^45) (5-Level Paging) + + + PFN (Physical): + [0, 2^32) (x86_32) + [0, 2^52) (x86_64, all paging modes) + + + VFN: [0, 1024) (32-Bit 2-Level paging) + [0, 512) (4-Level Paging) + [0, 512) (5-Level Paging) + + In addition, we also defines VMS_{MASK|SIZE} to provide + information about maximium size of addressable virtual + memory space (hence VMS). Which is effectively a + "Level -1 Page" (i.e., _PAGE_Ln_SIZE(-1)) + + +*/ + +struct __pte; +typedef struct __pte pte_t; + + +#include +#include + +#define _LnTEP_AT(vm_mnt, sz) ( ((vm_mnt) | L0T_MASK) & ~(sz) ) +#define _L0TEP_AT(vm_mnt) ( ((vm_mnt) | L0T_MASK) & ~LFT_MASK ) +#define _L1TEP_AT(vm_mnt) ( ((vm_mnt) | L0T_MASK) & ~L3T_MASK ) +#define _L2TEP_AT(vm_mnt) ( ((vm_mnt) | L0T_MASK) & ~L2T_MASK ) +#define _L3TEP_AT(vm_mnt) ( ((vm_mnt) | L0T_MASK) & ~L1T_MASK ) +#define _LFTEP_AT(vm_mnt) ( ((vm_mnt) | L0T_MASK) & ~L0T_MASK ) + +#define _VM_OF(ptep) ( (ptr_t)(ptep) & ~L0T_MASK ) +#define _VM_PFN_OF(ptep) ( ((ptr_t)(ptep) & L0T_MASK) / sizeof(pte_t) ) +#define VMS_SELF ( ~L0T_MASK & VMS_MASK ) + +#define __LnTI_OF(ptep, n)\ + (_VM_PFN_OF(ptep) * LFT_SIZE / L##n##T_SIZE) + +#define __LnTEP(ptep, va, n)\ + ( (pte_t*)_L##n##TEP_AT(_VM_OF(ptep)) + (((va) & VMS_MASK) / L##n##T_SIZE) ) + +#define __LnTEP_OF(ptep, n)\ + ( (pte_t*)_L##n##TEP_AT(_VM_OF(ptep)) + __LnTI_OF(ptep, n)) + +#define __LnTEP_SHIFT_NEXT(ptep)\ + ( (pte_t*)(_VM_OF(ptep) | ((_VM_PFN_OF(ptep) * LFT_SIZE) & L0T_MASK)) ) + +#define _has_LnT(n) (L##n##T_SIZE != LFT_SIZE) +#define LnT_ENABLED(n) _has_LnT(n) + +#define ptep_with_level(ptep, lvl_size) \ + ({ \ + ptr_t __p = _LnTEP_AT(_VM_OF(ptep), lvl_size); \ + ((ptr_t)(ptep) & __p) == __p; \ + }) + +pte_t +vmm_alloc_page(pte_t* ptep, pte_t pte); + +/** + * @brief Try page walk to the pte pointed by ptep and + * allocate any missing level-table en-route + * + * @param ptep + * @param va + */ +void +ptep_alloc_hierarchy(pte_t* ptep, ptr_t va, pte_attr_t prot); + +static inline bool +__alloc_level(pte_t* ptep, pte_t pte, pte_attr_t prot) +{ + if (!pte_isnull(pte)) { + return true; + } + + pte = pte_setprot(pte, prot); + return !pte_isnull(vmm_alloc_page(ptep, pte)); +} + +/** + * @brief Get the page frame number encoded in ptep + * + * @param ptep + * @return ptr_t + */ +static inline ptr_t +ptep_pfn(pte_t* ptep) +{ + return _VM_PFN_OF(ptep); +} + +/** + * @brief Get the virtual frame number encoded in ptep + * + * @param ptep + * @return ptr_t + */ +static inline unsigned int +ptep_vfn(pte_t* ptep) +{ + return ((ptr_t)ptep & PAGE_MASK) / sizeof(pte_t); +} + +static inline ptr_t +ptep_va(pte_t* ptep, size_t lvl_size) +{ + return ((ptr_t)ptep) / sizeof(pte_t) * lvl_size; +} + +static inline ptr_t +ptep_vm_mnt(pte_t* ptep) +{ + return _VM_OF(ptep); +} + +/** + * @brief Make a L0TEP from given ptep + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +mkl0tep(pte_t* ptep) +{ + return __LnTEP_OF(ptep, 0); +} + +/** + * @brief Make a L1TEP from given ptep + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +mkl1tep(pte_t* ptep) +{ + return __LnTEP_OF(ptep, 1); +} + +/** + * @brief Make a L2TEP from given ptep + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +mkl2tep(pte_t* ptep) +{ + return __LnTEP_OF(ptep, 2); +} + +/** + * @brief Make a L3TEP from given ptep + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +mkl3tep(pte_t* ptep) +{ + return __LnTEP_OF(ptep, 3); +} + +/** + * @brief Create the L1T pointed by L0TE + * + * @param l0t_ptep + * @param va + * @return pte_t* + */ +static inline pte_t* +mkl1t(pte_t* l0t_ptep, ptr_t va, pte_attr_t prot) +{ +#if _has_LnT(1) + if (!l0t_ptep) { + return NULL; + } + + pte_t pte = pte_at(l0t_ptep); + + if (pte_huge(pte)) { + return l0t_ptep; + } + + return __alloc_level(l0t_ptep, pte, prot) + ? __LnTEP(l0t_ptep, va, 1) + : NULL; +#else + return l0t_ptep; +#endif +} + +/** + * @brief Create the L2T pointed by L1TE + * + * @param l0t_ptep + * @param va + * @return pte_t* + */ +static inline pte_t* +mkl2t(pte_t* l1t_ptep, ptr_t va, pte_attr_t prot) +{ +#if _has_LnT(2) + if (!l1t_ptep) { + return NULL; + } + + pte_t pte = pte_at(l1t_ptep); + + if (pte_huge(pte)) { + return l1t_ptep; + } + + return __alloc_level(l1t_ptep, pte, prot) + ? __LnTEP(l1t_ptep, va, 2) + : NULL; +#else + return l1t_ptep; +#endif +} + +/** + * @brief Create the L3T pointed by L2TE + * + * @param l0t_ptep + * @param va + * @return pte_t* + */ +static inline pte_t* +mkl3t(pte_t* l2t_ptep, ptr_t va, pte_attr_t prot) +{ +#if _has_LnT(3) + if (!l2t_ptep) { + return NULL; + } + + pte_t pte = pte_at(l2t_ptep); + + if (pte_huge(pte)) { + return l2t_ptep; + } + + return __alloc_level(l2t_ptep, pte, prot) + ? __LnTEP(l2t_ptep, va, 3) + : NULL; +#else + return l2t_ptep; +#endif +} + +/** + * @brief Create the LFT pointed by L3TE + * + * @param l0t_ptep + * @param va + * @return pte_t* + */ +static inline pte_t* +mklft(pte_t* l3t_ptep, ptr_t va, pte_attr_t prot) +{ + if (!l3t_ptep) { + return NULL; + } + + pte_t pte = pte_at(l3t_ptep); + + if (pte_huge(pte)) { + return l3t_ptep; + } + + return __alloc_level(l3t_ptep, pte, prot) + ? __LnTEP(l3t_ptep, va, F) + : NULL; +} + +static inline pte_t* +getl1tep(pte_t* l0t_ptep, ptr_t va) { +#if _has_LnT(1) + return __LnTEP(l0t_ptep, va, 1); +#else + return l0t_ptep; +#endif +} + +static inline pte_t* +getl2tep(pte_t* l1t_ptep, ptr_t va) { +#if _has_LnT(2) + return __LnTEP(l1t_ptep, va, 2); +#else + return l1t_ptep; +#endif +} + +static inline pte_t* +getl3tep(pte_t* l2t_ptep, ptr_t va) { +#if _has_LnT(3) + return __LnTEP(l2t_ptep, va, 3); +#else + return l2t_ptep; +#endif +} + +static inline pte_t* +getlftep(pte_t* l3t_ptep, ptr_t va) { + return __LnTEP(l3t_ptep, va, F); +} + +static inline unsigned int +l0te_index(pte_t* ptep) { + return __LnTI_OF(ptep, 1); +} + +static inline unsigned int +l1te_index(pte_t* ptep) { + return __LnTI_OF(ptep, 2); +} + +static inline unsigned int +l2te_index(pte_t* ptep) { + return __LnTI_OF(ptep, 3); +} + +static inline unsigned int +l3te_index(pte_t* ptep) { + return __LnTI_OF(ptep, F); +} + +static inline pfn_t +pfn(ptr_t addr) { + return (addr / PAGE_SIZE) & VMS_MASK; +} + +static inline size_t +leaf_count(size_t size) { + return (size + PAGE_MASK) / PAGE_SIZE; +} + +static inline size_t +page_count(size_t size, size_t page_size) { + return (size + (page_size - 1)) / page_size; +} + +static inline unsigned int +va_offset(ptr_t addr) { + return addr & PAGE_MASK; +} + +static inline ptr_t +page_addr(ptr_t pfn) { + return pfn * PAGE_SIZE; +} + +static inline ptr_t +va_align(ptr_t va) { + return va & ~PAGE_MASK; +} + +static inline ptr_t +va_alignup(ptr_t va) { + return (va + PAGE_MASK) & ~PAGE_MASK; +} + +static inline pte_t* +mkptep_va(ptr_t vm_mnt, ptr_t vaddr) +{ + return (pte_t*)(vm_mnt & ~L0T_MASK) + pfn(vaddr); +} + +static inline pte_t* +mkptep_pn(ptr_t vm_mnt, ptr_t pn) +{ + return (pte_t*)(vm_mnt & ~L0T_MASK) + (pn & L0T_MASK); +} + +static inline pfn_t +pfn_at(ptr_t va, size_t lvl_size) { + return va / lvl_size; +} + + +/** + * @brief Shift the ptep such that it points to an + * immediate lower level of page table + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +ptep_step_into(pte_t* ptep) +{ + return __LnTEP_SHIFT_NEXT(ptep); +} + +/** + * @brief Shift the ptep such that it points to an + * immediate upper level of page table + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +ptep_step_out(pte_t* ptep) +{ + ptr_t unshifted = (ptr_t)mkptep_pn(VMS_SELF, ptep_pfn(ptep)); + return mkptep_va(_VM_OF(ptep), unshifted); +} + +/** + * @brief Make a L0TEP from given mnt and va + * + * @param ptep + * @return pte_t* + */ +static inline pte_t* +mkl0tep_va(ptr_t mnt, ptr_t va) +{ + return mkl0tep(mkptep_va(mnt, va)); +} + +static inline bool +pt_last_level(int level) +{ + return level == _PTW_LEVEL - 1; +} + +#endif /* __LUNAIX_PAGETABLE_H */ diff --git a/lunaix-os/includes/lunaix/mm/pmm.h b/lunaix-os/includes/lunaix/mm/pmm.h index ef9ec0b..fa22f7b 100644 --- a/lunaix-os/includes/lunaix/mm/pmm.h +++ b/lunaix-os/includes/lunaix/mm/pmm.h @@ -13,13 +13,13 @@ * @brief 长久页:不会被缓存,但允许释放 * */ -#define PP_FGPERSIST 0x1 +#define PP_FGPERSIST 0b00001 /** * @brief 锁定页:不会被缓存,不能被释放 * */ -#define PP_FGLOCKED 0x2 +#define PP_FGLOCKED 0b00011 typedef u32_t pp_attr_t; @@ -96,15 +96,42 @@ struct pp_struct* pmm_query(ptr_t pa); /** - * @brief 释放一个已分配的物理页,假若页地址不存在,则无操作。 + * @brief Free physical page with given attributes + * + * @param page + * @return int + */ +int +pmm_free_one(ptr_t page, pp_attr_t attr_mask); + +/** + * @brief Free a normal physical page * * @param page 页地址 * @return 是否成功 */ -int -pmm_free_page(ptr_t page); +static inline int +pmm_free_page(ptr_t page) +{ + return pmm_free_one(page, 0); +} + +/** + * @brief Free physical page regardless of it's attribute + * + * @param page + * @return int + */ +static inline int +pmm_free_any(ptr_t page) +{ + return pmm_free_one(page, -1); +} int pmm_ref_page(ptr_t page); +void +pmm_set_attr(ptr_t page, pp_attr_t attr); + #endif /* __LUNAIX_PMM_H */ diff --git a/lunaix-os/includes/lunaix/mm/procvm.h b/lunaix-os/includes/lunaix/mm/procvm.h index 295d93a..820bf1e 100644 --- a/lunaix-os/includes/lunaix/mm/procvm.h +++ b/lunaix-os/includes/lunaix/mm/procvm.h @@ -5,41 +5,17 @@ #include #include #include +#include struct proc_mm; struct proc_info; -struct mm_region -{ - struct llist_header head; // must be first field! - struct proc_mm* proc_vms; - - // file mapped to this region - struct v_file* mfile; - // mapped file offset - off_t foff; - // mapped file length - u32_t flen; // XXX it seems that we don't need this actually.. - - ptr_t start; - ptr_t end; - u32_t attr; - - void** index; // fast reference, to accelerate access to this very region. - - void* data; - // when a region is copied - void (*region_copied)(struct mm_region*); - // when a region is unmapped - void (*destruct_region)(struct mm_region*); -}; - struct remote_vmctx { ptr_t vms_mnt; ptr_t local_mnt; ptr_t remote; - size_t page_cnt; + pfn_t page_cnt; }; @@ -55,10 +31,13 @@ typedef struct llist_header vm_regions_t; struct proc_mm { // virtual memory root (i.e. root page table) - ptr_t vmroot; - vm_regions_t regions; + ptr_t vmroot; + ptr_t vm_mnt; // current mount point + vm_regions_t regions; + struct mm_region* heap; struct proc_info* proc; + struct proc_mm* guest_mm; // vmspace mounted by this vmspace }; /** @@ -71,26 +50,45 @@ struct proc_mm* procvm_create(struct proc_info* proc); /** - * @brief Initialize the vm of `proc` to duplication of current process + * @brief Initialize and mount the vm of `proc` to duplication of current process * * @param proc * @return struct proc_mm* */ void -procvm_dup(struct proc_info* proc); +procvm_dupvms_mount(struct proc_mm* proc); void -procvm_cleanup(ptr_t vm_mnt, struct proc_info* proc); +procvm_unmount_release(struct proc_mm* proc); +void +procvm_mount(struct proc_mm* mm); + +void +procvm_unmount(struct proc_mm* mm); /** - * @brief Initialize the vm of `proc` as a clean slate which contains + * @brief Initialize and mount the vms of `proc` as a clean slate which contains * nothing but shared global mapping of kernel image. * * @param proc */ void -procvm_init_clean(struct proc_info* proc); +procvm_initvms_mount(struct proc_mm* mm); + + +/* + Mount and unmount from VMS_SELF. + Although every vms is mounted to that spot by default, + this just serve the purpose to ensure the scheduled + vms does not dangling in some other's vms. +*/ + +void +procvm_mount_self(struct proc_mm* mm); + +void +procvm_unmount_self(struct proc_mm* mm); /* @@ -101,13 +99,13 @@ procvm_init_clean(struct proc_info* proc); ptr_t procvm_enter_remote_transaction(struct remote_vmctx* rvmctx, struct proc_mm* mm, - ptr_t vm_mnt, ptr_t remote_base, size_t size); + ptr_t remote_base, size_t size); int procvm_copy_remote(struct remote_vmctx* rvmctx, ptr_t remote_dest, void* local_src, size_t sz); void -procvm_exit_remote_transaction(struct remote_vmctx* rvmctx); +procvm_exit_remote(struct remote_vmctx* rvmctx); #endif /* __LUNAIX_PROCVM_H */ diff --git a/lunaix-os/includes/lunaix/mm/region.h b/lunaix-os/includes/lunaix/mm/region.h index d030f6d..cc7d3df 100644 --- a/lunaix-os/includes/lunaix/mm/region.h +++ b/lunaix-os/includes/lunaix/mm/region.h @@ -2,7 +2,6 @@ #define __LUNAIX_REGION_H #include -#include #include #define prev_region(vmr) list_prev(vmr, struct mm_region, head) @@ -31,6 +30,21 @@ region_size(struct mm_region* mm) { return mm->end - mm->start; } +static inline bool +anon_region(struct mm_region* mm) { + return (mm->attr & REGION_ANON); +} + +static inline bool +writable_region(struct mm_region* mm) { + return !!(mm->attr & (REGION_RSHARED | REGION_WRITE)); +} + +static inline bool +shared_writable_region(struct mm_region* mm) { + return !!(mm->attr & REGION_WSHARED); +} + struct mm_region* region_create(ptr_t start, ptr_t end, u32_t attr); @@ -56,17 +70,10 @@ region_copy_mm(struct proc_mm* src, struct proc_mm* dest); struct mm_region* region_dup(struct mm_region* origin); -static u32_t -region_ptattr(struct mm_region* vmr) +static inline pte_attr_t +region_pteprot(struct mm_region* vmr) { - u32_t vmr_attr = vmr->attr; - u32_t ptattr = PG_PRESENT | PG_ALLOW_USER; - - if ((vmr_attr & PROT_WRITE)) { - ptattr |= PG_WRITE; - } - - return ptattr & 0xfff; + return translate_vmr_prot(vmr->attr); } #endif /* __LUNAIX_REGION_H */ diff --git a/lunaix-os/includes/lunaix/mm/vmm.h b/lunaix-os/includes/lunaix/mm/vmm.h index 74cba52..a3da8c0 100644 --- a/lunaix-os/includes/lunaix/mm/vmm.h +++ b/lunaix-os/includes/lunaix/mm/vmm.h @@ -1,6 +1,7 @@ #ifndef __LUNAIX_VMM_H #define __LUNAIX_VMM_H -#include + +#include #include #include // Virtual memory manager @@ -38,14 +39,6 @@ void vmm_init(); -/** - * @brief 创建一个页目录 - * - * @return ptd_entry* 页目录的物理地址,随时可以加载进CR3 - */ -x86_page_table* -vmm_init_pd(); - /** * @brief 在指定地址空间中,添加一个映射 * @@ -56,7 +49,37 @@ vmm_init_pd(); * @return int */ int -vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options); +vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pte_attr_t prot); + +static inline void +vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n) +{ + do { + set_pte(ptep, pte); + pte_val(pte) += lvl_size; + ptep++; + } while (--n > 0); +} + +static inline void +vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n) +{ + do { + set_pte(ptep, pte); + ptep++; + } while (--n > 0); +} + + +static inline void +vmm_unset_ptes(pte_t* ptep, size_t n) +{ + do { + set_pte(ptep, null_pte); + ptep++; + } while (--n > 0); +} + /** * @brief 删除一个映射 @@ -69,14 +92,8 @@ vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options); ptr_t vmm_del_mapping(ptr_t mnt, ptr_t va); -/** - * @brief 在当前虚拟地址空间里查找一个映射 - * - * @param va 虚拟地址 - * @param mapping 映射相关属性 - */ -int -vmm_lookup(ptr_t va, v_mapping* mapping); +pte_t +vmm_tryptep(pte_t* ptep, size_t lvl_size); /** * @brief 在指定的虚拟地址空间里查找一个映射 @@ -86,8 +103,15 @@ vmm_lookup(ptr_t va, v_mapping* mapping); * @param mapping 映射相关属性 * @return int */ -int -vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping); +static inline bool +vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out) +{ + pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE); + *pte_out = pte; + + return !pte_isnull(pte); +} + /** * @brief (COW) 为虚拟页创建副本。 @@ -105,25 +129,28 @@ vmm_dup_page(ptr_t pa); * @return ptr_t */ ptr_t -vmm_mount_pd(ptr_t mnt, ptr_t pde); +vms_mount(ptr_t mnt, ptr_t pde); /** * @brief 卸载已挂载的虚拟地址空间 * */ ptr_t -vmm_unmount_pd(ptr_t mnt); +vms_unmount(ptr_t mnt); static inline ptr_t -vmm_mount_pg(ptr_t mnt, ptr_t pa) { +mount_page(ptr_t mnt, ptr_t pa) { assert(pa); - vmm_set_mapping(VMS_SELF, mnt, pa, PG_PREM_RW, 0); + pte_t* ptep = mkptep_va(VMS_SELF, mnt); + set_pte(ptep, mkpte(pa, KERNEL_DATA)); + cpu_flush_page(mnt); return mnt; } static inline ptr_t -vmm_unmount_pg(ptr_t mnt) { - vmm_del_mapping(VMS_SELF, mnt); +unmount_page(ptr_t mnt) { + pte_t* ptep = mkptep_va(VMS_SELF, mnt); + set_pte(ptep, null_pte); return mnt; } @@ -133,15 +160,6 @@ vmm_ioremap(ptr_t paddr, size_t size); void* vmm_next_free(ptr_t start, int options); -/** - * @brief 将当前地址空间的虚拟地址转译为物理地址。 - * - * @param va 虚拟地址 - * @return void* - */ -ptr_t -vmm_v2p(ptr_t va); - /** * @brief 将指定地址空间的虚拟地址转译为物理地址 * @@ -152,54 +170,58 @@ vmm_v2p(ptr_t va); ptr_t vmm_v2pat(ptr_t mnt, ptr_t va); -/* - 表示一个 vmap 区域 - (One must not get confused with vmap_area in Linux!) -*/ -struct vmap_area -{ - ptr_t start; - size_t size; - pt_attr area_attr; -}; - /** - * @brief 将连续的物理地址空间映射到内核虚拟地址空间 + * @brief 将当前地址空间的虚拟地址转译为物理地址。 * - * @param paddr 物理地址空间的基地址 - * @param size 物理地址空间的大小 + * @param va 虚拟地址 * @return void* */ -void* -vmap(ptr_t paddr, size_t size, pt_attr attr, int flags); +static inline ptr_t +vmm_v2p(ptr_t va) +{ + return vmm_v2pat(VMS_SELF, va); +} /** - * @brief 创建一个 vmap 区域 - * - * @param paddr - * @param attr - * @return ptr_t + * @brief Maps a number of contiguous ptes in kernel + * address space + * + * @param pte the pte to be mapped + * @param lvl_size size of the page pointed by the given pte + * @param n number of ptes + * @return ptr_t */ -struct vmap_area* -vmap_varea(size_t size, pt_attr attr); +ptr_t +vmap_ptes_at(pte_t pte, size_t lvl_size, int n); /** - * @brief 在 vmap区域内映射一个单页 - * - * @param paddr - * @param attr - * @return ptr_t + * @brief Maps a number of contiguous ptes in kernel + * address space (leaf page size) + * + * @param pte the pte to be mapped + * @param n number of ptes + * @return ptr_t */ -ptr_t -vmap_area_page(struct vmap_area* area, ptr_t paddr, pt_attr attr); +static inline ptr_t +vmap_leaf_ptes(pte_t pte, int n) +{ + return vmap_ptes_at(pte, LFT_SIZE, n); +} /** - * @brief 在 vmap区域删除一个已映射的页 - * - * @param paddr - * @return ptr_t + * @brief Maps a contiguous range of physical address + * into kernel address space (leaf page size) + * + * @param paddr start of the physical address range + * @param size size of the physical range + * @param prot default protection to be applied + * @return ptr_t */ -ptr_t -vmap_area_rmpage(struct vmap_area* area, ptr_t vaddr); +static inline ptr_t +vmap(ptr_t paddr, size_t size, pte_attr_t prot) +{ + pte_t _pte = mkpte(paddr, prot); + return vmap_ptes_at(_pte, LFT_SIZE, leaf_count(size)); +} #endif /* __LUNAIX_VMM_H */ diff --git a/lunaix-os/includes/lunaix/process.h b/lunaix-os/includes/lunaix/process.h index 78756de..f4a526f 100644 --- a/lunaix-os/includes/lunaix/process.h +++ b/lunaix-os/includes/lunaix/process.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include @@ -167,19 +167,19 @@ set_current_executing(struct thread* thread) static inline struct proc_mm* vmspace(struct proc_info* proc) { - return proc->mm; + return proc ? proc->mm : NULL; } static inline ptr_t vmroot(struct proc_info* proc) { - return proc->mm->vmroot; + return proc ? proc->mm->vmroot : 0; } static inline vm_regions_t* vmregions(struct proc_info* proc) { - return &proc->mm->regions; + return proc ? &proc->mm->regions : NULL; } static inline void @@ -302,7 +302,7 @@ struct thread* alloc_thread(struct proc_info* process); void -destory_thread(ptr_t vm_mnt, struct thread* thread); +destory_thread(struct thread* thread); void terminate_thread(struct thread* thread, ptr_t val); @@ -311,26 +311,26 @@ void terminate_current_thread(ptr_t val); struct thread* -create_thread(struct proc_info* proc, ptr_t vm_mnt, bool with_ustack); +create_thread(struct proc_info* proc, bool with_ustack); void -start_thread(struct thread* th, ptr_t vm_mnt, ptr_t entry); +start_thread(struct thread* th, ptr_t entry); static inline void spawn_kthread(ptr_t entry) { assert(kernel_process(__current)); - struct thread* th = create_thread(__current, VMS_SELF, false); + struct thread* th = create_thread(__current, false); assert(th); - start_thread(th, VMS_SELF, entry); + start_thread(th, entry); } void exit_thread(void* val); void -thread_release_mem(struct thread* thread, ptr_t vm_mnt); +thread_release_mem(struct thread* thread); /* ========= Signal ========= diff --git a/lunaix-os/includes/lunaix/spike.h b/lunaix-os/includes/lunaix/spike.h index da901fc..cf40bab 100644 --- a/lunaix-os/includes/lunaix/spike.h +++ b/lunaix-os/includes/lunaix/spike.h @@ -84,7 +84,7 @@ #define must_success(statement) \ do { \ int err = (statement); \ - if (err) panickf(#statement "failed with errcode=%d", err); \ + if (err) fail(#statement " failed"); \ } while(0) #define fail(msg) __assert_fail(msg, __FILE__, __LINE__); @@ -101,9 +101,6 @@ __assert_fail(const char* expr, const char* file, unsigned int line) void noret panick(const char* msg); -void noret -panickf(const char* fmt, ...); - #define wait_until(cond) \ while (!(cond)) \ ; diff --git a/lunaix-os/includes/lunaix/syslog.h b/lunaix-os/includes/lunaix/syslog.h index 423823c..621c81a 100644 --- a/lunaix-os/includes/lunaix/syslog.h +++ b/lunaix-os/includes/lunaix/syslog.h @@ -2,6 +2,7 @@ #define __LUNAIX_SYSLOG_H #include +#include #include #define KLOG_DEBUG 0 @@ -35,7 +36,7 @@ #define FATAL(fmt, ...) \ ({ \ kprintf(KFATAL fmt, ##__VA_ARGS__); \ - spin(); \ + fail(fmt); \ }) void diff --git a/lunaix-os/kernel/block/block.c b/lunaix-os/kernel/block/block.c index bf83b5f..8ca5117 100644 --- a/lunaix-os/kernel/block/block.c +++ b/lunaix-os/kernel/block/block.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -156,7 +156,7 @@ __block_read_page(struct device* dev, void* buf, size_t offset) struct block_dev* bdev = (struct block_dev*)dev->underlay; u32_t lba = offset / bdev->blk_size + bdev->start_lba; - u32_t rd_lba = MIN(lba + PG_SIZE / bdev->blk_size, bdev->end_lba); + u32_t rd_lba = MIN(lba + PAGE_SIZE / bdev->blk_size, bdev->end_lba); if (rd_lba <= lba) { return 0; @@ -183,7 +183,7 @@ __block_write_page(struct device* dev, void* buf, size_t offset) struct block_dev* bdev = (struct block_dev*)dev->underlay; u32_t lba = offset / bdev->blk_size + bdev->start_lba; - u32_t wr_lba = MIN(lba + PG_SIZE / bdev->blk_size, bdev->end_lba); + u32_t wr_lba = MIN(lba + PAGE_SIZE / bdev->blk_size, bdev->end_lba); if (wr_lba <= lba) { return 0; diff --git a/lunaix-os/kernel/boot_helper.c b/lunaix-os/kernel/boot_helper.c index 3ac5bcb..f7ad158 100644 --- a/lunaix-os/kernel/boot_helper.c +++ b/lunaix-os/kernel/boot_helper.c @@ -1,11 +1,10 @@ #include #include -#include #include #include #include #include -#include +#include /** * @brief Reserve memory for kernel bootstrapping initialization @@ -16,34 +15,36 @@ void boot_begin(struct boot_handoff* bhctx) { bhctx->prepare(bhctx); + + // Identity-map the first 3GiB address spaces + pte_t* ptep = mkl0tep(mkptep_va(VMS_SELF, 0)); + pte_t pte = mkpte_prot(KERNEL_DATA); + size_t count = page_count(KERNEL_RESIDENT, L0T_SIZE); + + vmm_set_ptes_contig(ptep, pte_mkhuge(pte), L0T_SIZE, count); struct boot_mmapent *mmap = bhctx->mem.mmap, *mmapent; for (size_t i = 0; i < bhctx->mem.mmap_len; i++) { mmapent = &mmap[i]; - size_t size_pg = PN(ROUNDUP(mmapent->size, PG_SIZE)); + size_t size_pg = leaf_count(mmapent->size); + pfn_t start_pfn = pfn(mmapent->start); if (mmapent->type == BOOT_MMAP_FREE) { - pmm_mark_chunk_free(PN(mmapent->start), size_pg); + pmm_mark_chunk_free(start_pfn, size_pg); continue; } - - ptr_t pa = PG_ALIGN(mmapent->start); - for (size_t j = 0; j < size_pg && pa < KERNEL_EXEC; - j++, pa += PM_PAGE_SIZE) { - vmm_set_mapping(VMS_SELF, pa, pa, PG_PREM_RW, VMAP_IGNORE); - } } /* Reserve region for all loaded modules */ for (size_t i = 0; i < bhctx->mods.mods_num; i++) { struct boot_modent* mod = &bhctx->mods.entries[i]; - pmm_mark_chunk_occupied(PN(mod->start), - CEIL(mod->end - mod->start, PG_SIZE_BITS), - PP_FGLOCKED); + unsigned int counts = leaf_count(mod->end - mod->start); + + pmm_mark_chunk_occupied(pfn(mod->start), counts, PP_FGLOCKED); } } -extern u8_t __kexec_boot_end; /* link/linker.ld */ +extern u8_t __kboot_end; /* link/linker.ld */ /** * @brief Release memory for kernel bootstrapping initialization @@ -56,20 +57,14 @@ boot_end(struct boot_handoff* bhctx) struct boot_mmapent *mmap = bhctx->mem.mmap, *mmapent; for (size_t i = 0; i < bhctx->mem.mmap_len; i++) { mmapent = &mmap[i]; - size_t size_pg = PN(ROUNDUP(mmapent->size, PG_SIZE)); - - if (mmapent->start >= KERNEL_EXEC || mmapent->type == BOOT_MMAP_FREE) { - continue; - } + size_t size_pg = leaf_count(mmapent->size); if (mmapent->type == BOOT_MMAP_RCLM) { - pmm_mark_chunk_free(PN(mmapent->start), size_pg); + pmm_mark_chunk_free(pfn(mmapent->start), size_pg); } - ptr_t pa = PG_ALIGN(mmapent->start); - for (size_t j = 0; j < size_pg && pa < KERNEL_EXEC; - j++, pa += PM_PAGE_SIZE) { - vmm_del_mapping(VMS_SELF, pa); + if (mmapent->type == BOOT_MMAP_FREE) { + continue; } } @@ -83,11 +78,9 @@ boot_end(struct boot_handoff* bhctx) void boot_cleanup() { - // clean up - for (size_t i = 0; i < (ptr_t)(&__kexec_boot_end); i += PG_SIZE) { - vmm_del_mapping(VMS_SELF, (ptr_t)i); - pmm_free_page((ptr_t)i); - } + pte_t* ptep = mkl0tep(mkptep_va(VMS_SELF, 0)); + size_t count = page_count(KERNEL_RESIDENT, L0T_SIZE); + vmm_unset_ptes(ptep, count); } void diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 1e5c44a..2e30b09 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -23,11 +22,12 @@ trace_modksyms_init(struct boot_handoff* bhctx) for (size_t i = 0; i < bhctx->mods.mods_num; i++) { struct boot_modent* mod = &bhctx->mods.entries[i]; if (streq(mod->str, "modksyms")) { - assert(PG_ALIGNED(mod->start)); + assert(!va_offset(mod->start)); - ptr_t end = ROUNDUP(mod->end, PG_SIZE); - ptr_t ksym_va = - (ptr_t)vmap(mod->start, (end - mod->start), PG_PREM_R, 0); + pte_t pte = mkpte(mod->start, KERNEL_DATA); + size_t n = pfn(mod->end) - pfn(mod->start); + + ptr_t ksym_va = vmap_leaf_ptes(pte, n); assert(ksym_va); trace_ctx.ksym_table = (struct ksyms*)ksym_va; @@ -43,7 +43,7 @@ trace_sym_lookup(ptr_t addr) int i = c - 1, j = 0, m = 0; - if (addr > ksent[i].pc || addr < ksent[j].pc || addr < KERNEL_EXEC) { + if (addr > ksent[i].pc || addr < ksent[j].pc || !kernel_addr(addr)) { return NULL; } @@ -147,7 +147,12 @@ trace_printstack_of(ptr_t fp) void trace_printstack() { - trace_printstack_of(abi_get_callframe()); + if (current_thread) { + trace_printstack_isr(current_thread->intr_ctx); + } + else { + trace_printstack_of(abi_get_callframe()); + } } static void diff --git a/lunaix-os/kernel/device/input.c b/lunaix-os/kernel/device/input.c index 6ced39d..cc3cc13 100644 --- a/lunaix-os/kernel/device/input.c +++ b/lunaix-os/kernel/device/input.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include @@ -66,7 +66,7 @@ __input_dev_read(struct device* dev, void* buf, size_t offset, size_t len) int __input_dev_read_pg(struct device* dev, void* buf, size_t offset) { - return __input_dev_read(dev, buf, offset, PG_SIZE); + return __input_dev_read(dev, buf, offset, PAGE_SIZE); } struct input_device* diff --git a/lunaix-os/kernel/exe/elf32/ldelf32.c b/lunaix-os/kernel/exe/elf32/ldelf32.c index a72a14d..64e0eba 100644 --- a/lunaix-os/kernel/exe/elf32/ldelf32.c +++ b/lunaix-os/kernel/exe/elf32/ldelf32.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include @@ -15,7 +14,7 @@ elf32_smap(struct load_context* ldctx, { struct v_file* elfile = (struct v_file*)elf->elf_file; - assert(PG_ALIGNED(phdre->p_offset)); + assert(!va_offset(phdre->p_offset)); int proct = 0; if ((phdre->p_flags & PF_R)) { @@ -33,17 +32,17 @@ elf32_smap(struct load_context* ldctx, struct mmap_param param = { .vms_mnt = container->vms_mnt, .pvms = vmspace(container->proc), .proct = proct, - .offset = PG_ALIGN(phdre->p_offset), - .mlen = ROUNDUP(phdre->p_memsz, PG_SIZE), + .offset = va_align(phdre->p_offset), + .mlen = va_alignup(phdre->p_memsz), .flags = MAP_FIXED | MAP_PRIVATE, .type = REGION_TYPE_CODE }; struct mm_region* seg_reg; - int status = mmap_user(NULL, &seg_reg, PG_ALIGN(va), elfile, ¶m); + int status = mmap_user(NULL, &seg_reg, va_align(va), elfile, ¶m); if (!status) { size_t next_addr = phdre->p_memsz + va; - ldctx->end = MAX(ldctx->end, ROUNDUP(next_addr, PG_SIZE)); + ldctx->end = MAX(ldctx->end, va_alignup(next_addr)); ldctx->mem_sz += phdre->p_memsz; } else { // we probably fucked up our process @@ -117,7 +116,7 @@ load_executable(struct load_context* context, const struct v_file* exefile) continue; } - if (phdr->p_align != PG_SIZE) { + if (phdr->p_align != PAGE_SIZE) { // surprising alignment! errno = ENOEXEC; break; diff --git a/lunaix-os/kernel/exe/exec.c b/lunaix-os/kernel/exe/exec.c index 9ab8ad7..6f2962e 100644 --- a/lunaix-os/kernel/exe/exec.c +++ b/lunaix-os/kernel/exe/exec.c @@ -120,7 +120,7 @@ exec_load(struct exec_container* container, struct v_file* executable) if (!argv_extra[1]) { // If loading a statically linked file, then heap remapping we can do, // otherwise delayed. - create_heap(vmspace(proc), PG_ALIGN(container->exe.end)); + create_heap(vmspace(proc), va_align(container->exe.end)); } if (container->vms_mnt == VMS_SELF) { diff --git a/lunaix-os/kernel/fs/pcache.c b/lunaix-os/kernel/fs/pcache.c index 4c6f69c..3e77cf5 100644 --- a/lunaix-os/kernel/fs/pcache.c +++ b/lunaix-os/kernel/fs/pcache.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -36,7 +35,7 @@ pcache_alloc_page() return NULL; } - if (!(va = (ptr_t)vmap(pp, PG_SIZE, PG_PREM_RW, 0))) { + if (!(va = (ptr_t)vmap(pp, PAGE_SIZE, KERNEL_DATA))) { pmm_free_page(pp); return NULL; } @@ -47,7 +46,7 @@ pcache_alloc_page() void pcache_init(struct pcache* pcache) { - btrie_init(&pcache->tree, PG_SIZE_BITS); + btrie_init(&pcache->tree, PAGE_SHIFT); llist_init_head(&pcache->dirty); llist_init_head(&pcache->pages); @@ -134,7 +133,7 @@ pcache_write(struct v_inode* inode, void* data, u32_t len, u32_t fpos) struct pcache_pg* pg; while (buf_off < len && errno >= 0) { - u32_t wr_bytes = MIN(PG_SIZE - pg_off, len - buf_off); + u32_t wr_bytes = MIN(PAGE_SIZE - pg_off, len - buf_off); int new_page = pcache_get_page(pcache, fpos, &pg_off, &pg); @@ -145,7 +144,7 @@ pcache_write(struct v_inode* inode, void* data, u32_t len, u32_t fpos) if (errno < 0) { break; } - if (errno < PG_SIZE) { + if (errno < (int)PAGE_SIZE) { // EOF len = MIN(len, buf_off + errno); } @@ -182,7 +181,7 @@ pcache_read(struct v_inode* inode, void* data, u32_t len, u32_t fpos) if (errno < 0) { break; } - if (errno < PG_SIZE) { + if (errno < (int)PAGE_SIZE) { // EOF len = MIN(len, buf_off + errno); } diff --git a/lunaix-os/kernel/fs/vfs.c b/lunaix-os/kernel/fs/vfs.c index c59584a..eb42396 100644 --- a/lunaix-os/kernel/fs/vfs.c +++ b/lunaix-os/kernel/fs/vfs.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -1454,7 +1453,7 @@ __DEFINE_LXSYSCALL2(int, fstat, int, fd, struct file_stat*, stat) .st_blocks = vino->lb_usage, .st_size = vino->fsize, .mode = vino->itype, - .st_ioblksize = PG_SIZE, + .st_ioblksize = PAGE_SIZE, .st_blksize = vino->sb->blksize}; if (VFS_DEVFILE(vino->itype)) { diff --git a/lunaix-os/kernel/kinit.c b/lunaix-os/kernel/kinit.c index 2d911bd..b19dc30 100644 --- a/lunaix-os/kernel/kinit.c +++ b/lunaix-os/kernel/kinit.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -23,7 +22,7 @@ #include #include -#include +#include #include #include @@ -56,7 +55,7 @@ kernel_bootstrap(struct boot_handoff* bhctx) invoke_init_function(on_earlyboot); // FIXME this goes to hal/gfxa - tty_init(ioremap(0xB8000, PG_SIZE)); + tty_init(ioremap(0xB8000, PAGE_SIZE)); tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK); device_sysconf_load(); @@ -94,6 +93,7 @@ kernel_bootstrap(struct boot_handoff* bhctx) * and start geting into uspace */ boot_end(bhctx); + boot_cleanup(); spawn_lunad(); } @@ -124,13 +124,23 @@ kmem_init(struct boot_handoff* bhctx) { extern u8_t __kexec_end; // 将内核占据的页,包括前1MB,hhk_init 设为已占用 - size_t pg_count = ((ptr_t)&__kexec_end - KERNEL_EXEC) >> PG_SIZE_BITS; + size_t pg_count = leaf_count((ptr_t)&__kexec_end - KERNEL_RESIDENT); pmm_mark_chunk_occupied(0, pg_count, PP_FGLOCKED); - // reserve higher half - for (size_t i = L1_INDEX(KERNEL_EXEC); i < 1023; i++) { - assert(vmm_set_mapping(VMS_SELF, i << 22, 0, 0, VMAP_NOMAP)); - } + pte_t* ptep = mkptep_va(VMS_SELF, KERNEL_RESIDENT); + ptep = mkl0tep(ptep); + + do { +#if LnT_ENABLED(1) + assert(mkl1t(ptep++, 0, KERNEL_DATA)); +#elif LnT_ENABLED(2) + assert(mkl2t(ptep++, 0, KERNEL_DATA)); +#elif LnT_ENABLED(3) + assert(mkl3t(ptep++, 0, KERNEL_DATA)); +#else + assert(mklft(ptep++, 0, KERNEL_DATA)); +#endif + } while (ptep_vfn(ptep) < MAX_PTEN - 2); // allocators cake_init(); diff --git a/lunaix-os/kernel/lunad.c b/lunaix-os/kernel/lunad.c index 99cd066..34368b6 100644 --- a/lunaix-os/kernel/lunad.c +++ b/lunaix-os/kernel/lunad.c @@ -74,12 +74,6 @@ lunad_do_usr() { void _preemptible lunad_main() { - /* - * We must defer boot code/data cleaning to here, after we successfully - * escape that area - */ - boot_cleanup(); - spawn_kthread((ptr_t)init_platform); /* diff --git a/lunaix-os/kernel/mm/cake.c b/lunaix-os/kernel/mm/cake.c index 9503260..9707d52 100644 --- a/lunaix-os/kernel/mm/cake.c +++ b/lunaix-os/kernel/mm/cake.c @@ -32,7 +32,7 @@ __alloc_cake(unsigned int cake_pg) if (!pa) { return NULL; } - return vmap(pa, cake_pg * PG_SIZE, PG_PREM_RW, 0); + return (void*)vmap(pa, cake_pg * PAGE_SIZE, KERNEL_DATA); } struct cake_s* @@ -86,7 +86,7 @@ __init_pile(struct cake_pile* pile, *pile = (struct cake_pile){ .piece_size = piece_size, .cakes_count = 0, .pieces_per_cake = - (pg_per_cake * PG_SIZE) / + (pg_per_cake * PAGE_SIZE) / (piece_size + sizeof(piece_index_t)), .pg_per_cake = pg_per_cake }; diff --git a/lunaix-os/kernel/mm/dmm.c b/lunaix-os/kernel/mm/dmm.c index a76b9de..f665e9d 100644 --- a/lunaix-os/kernel/mm/dmm.c +++ b/lunaix-os/kernel/mm/dmm.c @@ -21,7 +21,7 @@ create_heap(struct proc_mm* pvms, ptr_t addr) .flags = MAP_ANON | MAP_PRIVATE, .type = REGION_TYPE_HEAP, .proct = PROT_READ | PROT_WRITE, - .mlen = PG_SIZE }; + .mlen = PAGE_SIZE }; int status = 0; struct mm_region* heap; if ((status = mmap_user(NULL, &heap, addr, NULL, &map_param))) { diff --git a/lunaix-os/kernel/mm/fault.c b/lunaix-os/kernel/mm/fault.c new file mode 100644 index 0000000..6ba63a7 --- /dev/null +++ b/lunaix-os/kernel/mm/fault.c @@ -0,0 +1,312 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +LOG_MODULE("pf") + +static void +__gather_memaccess_info(struct fault_context* context) +{ + pte_t* ptep = (pte_t*)context->fault_va; + ptr_t mnt = ptep_vm_mnt(ptep); + ptr_t refva; + + context->mm = vmspace(__current); + + if (mnt < VMS_MOUNT_1) { + refva = (ptr_t)ptep; + goto done; + } + + context->ptep_fault = true; + context->remote_fault = (mnt != VMS_SELF); + + if (context->remote_fault && context->mm) { + context->mm = context->mm->guest_mm; + assert(context->mm); + } + +#if LnT_ENABLED(1) + ptep = (pte_t*)page_addr(ptep_pfn(ptep)); + mnt = ptep_vm_mnt(ptep); + if (mnt < VMS_MOUNT_1) { + refva = (ptr_t)ptep; + goto done; + } +#endif + +#if LnT_ENABLED(2) + ptep = (pte_t*)page_addr(ptep_pfn(ptep)); + mnt = ptep_vm_mnt(ptep); + if (mnt < VMS_MOUNT_1) { + refva = (ptr_t)ptep; + goto done; + } +#endif + +#if LnT_ENABLED(3) + ptep = (pte_t*)page_addr(ptep_pfn(ptep)); + mnt = ptep_vm_mnt(ptep); + if (mnt < VMS_MOUNT_1) { + refva = (ptr_t)ptep; + goto done; + } +#endif + + ptep = (pte_t*)page_addr(ptep_pfn(ptep)); + mnt = ptep_vm_mnt(ptep); + + assert(mnt < VMS_MOUNT_1); + refva = (ptr_t)ptep; + +done: + context->fault_refva = refva; +} + +static bool +__prepare_fault_context(struct fault_context* fault) +{ + if (!__arch_prepare_fault_context(fault)) { + return false; + } + + __gather_memaccess_info(fault); + + pte_t* fault_ptep = fault->fault_ptep; + ptr_t fault_va = fault->fault_va; + pte_t fault_pte = *fault_ptep; + bool kernel_vmfault = kernel_addr(fault_va); + bool kernel_refaddr = kernel_addr(fault->fault_refva); + + // for a ptep fault, the parent page tables should match the actual + // accesser permission + if (kernel_refaddr) { + ptep_alloc_hierarchy(fault_ptep, fault_va, KERNEL_DATA); + } else { + ptep_alloc_hierarchy(fault_ptep, fault_va, USER_DATA); + } + + fault->fault_pte = fault_pte; + + if (fault->ptep_fault && !kernel_refaddr) { + fault->resolving = pte_setprot(fault_pte, USER_DATA); + } else { + fault->resolving = pte_setprot(fault_pte, KERNEL_DATA); + } + + fault->kernel_vmfault = kernel_vmfault; + fault->kernel_access = kernel_context(fault->ictx); + + return true; +} + +static void +__handle_conflict_pte(struct fault_context* fault) +{ + pte_t pte = fault->fault_pte; + ptr_t fault_pa = pte_paddr(pte); + if (!pte_allow_user(pte)) { + return; + } + + assert(pte_iswprotect(pte)); + + if (writable_region(fault->vmr)) { + // normal page fault, do COW + // TODO makes `vmm_dup_page` arch-independent + ptr_t pa = (ptr_t)vmm_dup_page(fault_pa); + + pmm_free_page(fault_pa); + pte_t new_pte = pte_setpaddr(pte, pa); + new_pte = pte_mkwritable(new_pte); + + fault_resolved(fault, new_pte, NO_PREALLOC); + } + + return; +} + + +static void +__handle_anon_region(struct fault_context* fault) +{ + pte_t pte = fault->resolving; + pte_attr_t prot = region_pteprot(fault->vmr); + pte = pte_setprot(pte, prot); + + fault_resolved(fault, pte, 0); +} + + +static void +__handle_named_region(struct fault_context* fault) +{ + struct mm_region* vmr = fault->vmr; + struct v_file* file = vmr->mfile; + + pte_t pte = fault->resolving; + ptr_t fault_va = va_align(fault->fault_va); + + u32_t mseg_off = (fault_va - vmr->start); + u32_t mfile_off = mseg_off + vmr->foff; + + int errno = file->ops->read_page(file->inode, (void*)fault_va, mfile_off); + if (errno < 0) { + ERROR("fail to populate page (%d)", errno); + return; + } + + pte_attr_t prot = region_pteprot(vmr); + pte = pte_setprot(pte, prot); + + fault_resolved(fault, pte, 0); +} + +static void +__handle_kernel_page(struct fault_context* fault) +{ + // we must ensure only ptep fault is resolvable + if (fault->fault_va < VMS_MOUNT_1) { + return; + } + + fault_resolved(fault, fault->resolving, 0); + pmm_set_attr(fault->prealloc_pa, PP_FGPERSIST); +} + + +static void +fault_prealloc_page(struct fault_context* fault) +{ + if (!pte_isnull(fault->fault_pte)) { + return; + } + + pte_t pte; + + pte = vmm_alloc_page(fault->fault_ptep, fault->resolving); + if (pte_isnull(pte)) { + return; + } + + fault->resolving = pte; + fault->prealloc_pa = pte_paddr(fault->resolving); + + pmm_set_attr(fault->prealloc_pa, 0); + cpu_flush_page(fault->fault_va); +} + + +static void noret +__fail_to_resolve(struct fault_context* fault) +{ + if (fault->prealloc_pa) { + pmm_free_page(fault->prealloc_pa); + } + + ERROR("(pid: %d) Segmentation fault on %p (%p,e=0x%x)", + __current->pid, + fault->fault_va, + fault->fault_instn, + fault->fault_data); + + trace_printstack_isr(fault->ictx); + + if (fault->kernel_access) { + // if a page fault from kernel is not resolvable, then + // something must be went south + FATAL("unresolvable page fault"); + unreachable; + } + + thread_setsignal(current_thread, _SIGSEGV); + + schedule(); + fail("Unexpected return from segfault"); + + unreachable; +} + +static bool +__try_resolve_fault(struct fault_context* fault) +{ + pte_t fault_pte = fault->fault_pte; + if (pte_isguardian(fault_pte)) { + ERROR("memory region over-running"); + return false; + } + + if (fault->kernel_vmfault && fault->kernel_access) { + __handle_kernel_page(fault); + goto done; + } + + assert(fault->mm); + vm_regions_t* vmr = &fault->mm->regions; + fault->vmr = region_get(vmr, fault->fault_va); + + if (!fault->vmr) { + return false; + } + + if (pte_isloaded(fault_pte)) { + __handle_conflict_pte(fault); + } + else if (anon_region(fault->vmr)) { + __handle_anon_region(fault); + } + else if (fault->vmr->mfile) { + __handle_named_region(fault); + } + else { + // page not present, might be a chance to introduce swap file? + ERROR("WIP page fault route"); + } + +done: + return !!(fault->resolve_type & RESOLVE_OK); +} + +void +intr_routine_page_fault(const isr_param* param) +{ + if (param->depth > 10) { + // Too many nested fault! we must messed up something + // XXX should we failed silently? + spin(); + } + + struct fault_context fault = { .ictx = param }; + + if (!__prepare_fault_context(&fault)) { + __fail_to_resolve(&fault); + } + + fault_prealloc_page(&fault); + + if (!__try_resolve_fault(&fault)) { + __fail_to_resolve(&fault); + } + + if ((fault.resolve_type & NO_PREALLOC)) { + if (fault.prealloc_pa) { + pmm_free_page(fault.prealloc_pa); + } + } + + set_pte(fault.fault_ptep, fault.resolving); + + cpu_flush_page(fault.fault_va); + cpu_flush_page((ptr_t)fault.fault_ptep); +} \ No newline at end of file diff --git a/lunaix-os/kernel/mm/mmap.c b/lunaix-os/kernel/mm/mmap.c index 1c3b8b8..3f273c0 100644 --- a/lunaix-os/kernel/mm/mmap.c +++ b/lunaix-os/kernel/mm/mmap.c @@ -6,12 +6,12 @@ #include #include -#include +#include #include // any size beyond this is bullshit -#define BS_SIZE (KERNEL_EXEC - USR_MMAP) +#define BS_SIZE (KERNEL_RESIDENT - USR_MMAP) int mem_has_overlap(vm_regions_t* regions, ptr_t start, ptr_t end) @@ -65,7 +65,7 @@ mmap_user(void** addr_out, struct v_file* file, struct mmap_param* param) { - param->range_end = KERNEL_EXEC; + param->range_end = KERNEL_RESIDENT; param->range_start = USR_EXEC; return mem_map(addr_out, created, addr, file, param); @@ -168,7 +168,7 @@ mem_map(void** addr_out, { assert_msg(addr, "addr can not be NULL"); - ptr_t last_end = USR_EXEC, found_loc = PG_ALIGN(addr); + ptr_t last_end = USR_EXEC, found_loc = va_align(addr); struct mm_region *pos, *n; vm_regions_t* vm_regions = ¶m->pvms->regions; @@ -215,20 +215,7 @@ found: region->proc_vms = param->pvms; region_add(vm_regions, region); - - int proct = param->proct; - int attr = PG_ALLOW_USER; - if ((proct & REGION_WRITE)) { - attr |= PG_WRITE; - } - if ((proct & REGION_KERNEL)) { - attr &= ~PG_ALLOW_USER; - } - - for (size_t i = 0; i < param->mlen; i += PG_SIZE) { - vmm_set_mapping(param->vms_mnt, found_loc + i, 0, attr, 0); - } - + if (file) { vfs_ref_file(file); } @@ -264,22 +251,24 @@ mem_sync_pages(ptr_t mnt, if (!region->mfile || !(region->attr & REGION_WSHARED)) { return; } + + pte_t* ptep = mkptep_va(mnt, start); + ptr_t va = va_align(start); - v_mapping mapping; - for (size_t i = 0; i < length; i += PG_SIZE) { - if (!vmm_lookupat(mnt, start + i, &mapping)) { + for (; va < start + length; va += PAGE_SIZE, ptep++) { + pte_t pte = vmm_tryptep(ptep, LFT_SIZE); + if (pte_isnull(pte)) { continue; } - if (PG_IS_DIRTY(*mapping.pte)) { - size_t offset = mapping.va - region->start + region->foff; + if (pte_dirty(pte)) { + size_t offset = va - region->start + region->foff; struct v_inode* inode = region->mfile->inode; - region->mfile->ops->write_page(inode, (void*)mapping.va, offset); - - *mapping.pte &= ~PG_DIRTY; + region->mfile->ops->write_page(inode, (void*)va, offset); - cpu_flush_page((ptr_t)mapping.pte); + set_pte(ptep, pte_mkclean(pte)); + cpu_flush_page(va); } else if ((options & MS_INVALIDATE)) { goto invalidate; } @@ -291,9 +280,9 @@ mem_sync_pages(ptr_t mnt, continue; invalidate: - *mapping.pte &= ~PG_PRESENT; - pmm_free_page(mapping.pa); - cpu_flush_page((ptr_t)mapping.pte); + set_pte(ptep, null_pte); + pmm_free_page(pte_paddr(pte)); + cpu_flush_page(va); } } @@ -332,13 +321,17 @@ mem_unmap_region(ptr_t mnt, struct mm_region* region) valloc_ensure_valid(region); - size_t len = ROUNDUP(region->end - region->start, PG_SIZE); - mem_sync_pages(mnt, region, region->start, len, 0); + pfn_t pglen = leaf_count(region->end - region->start); + mem_sync_pages(mnt, region, region->start, pglen * PAGE_SIZE, 0); - for (size_t i = region->start; i <= region->end; i += PG_SIZE) { - ptr_t pa = vmm_del_mapping(mnt, i); - if (pa) { - pmm_free_page(pa); + pte_t* ptep = mkptep_va(mnt, region->start); + for (size_t i = 0; i < pglen; i++, ptep++) { + pte_t pte = pte_at(ptep); + ptr_t pa = pte_paddr(pte); + + set_pte(ptep, null_pte); + if (pte_isloaded(pte)) { + pmm_free_page(pte_paddr(pte)); } } @@ -393,22 +386,25 @@ __unmap_overlapped_cases(ptr_t mnt, shrink = vmr->end - seg_start; umps_len = shrink; umps_start = seg_start; - } else if (CASE_HITE(vmr, seg_start, seg_len)) { + } + else if (CASE_HITE(vmr, seg_start, seg_len)) { shrink = vmr->end - seg_start; umps_len = shrink; umps_start = seg_start; - } else if (CASE_HETI(vmr, seg_start, seg_len)) { + } + else if (CASE_HETI(vmr, seg_start, seg_len)) { displ = seg_len - (vmr->start - seg_start); umps_len = displ; umps_start = vmr->start; - } else if (CASE_HETE(vmr, seg_start, seg_len)) { + } + else if (CASE_HETE(vmr, seg_start, seg_len)) { shrink = vmr->end - vmr->start; umps_len = shrink; umps_start = vmr->start; } mem_sync_pages(mnt, vmr, vmr->start, umps_len, 0); - for (size_t i = 0; i < umps_len; i += PG_SIZE) { + for (size_t i = 0; i < umps_len; i += PAGE_SIZE) { ptr_t pa = vmm_del_mapping(mnt, vmr->start + i); if (pa) { pmm_free_page(pa); @@ -434,8 +430,8 @@ __unmap_overlapped_cases(ptr_t mnt, int mem_unmap(ptr_t mnt, vm_regions_t* regions, ptr_t addr, size_t length) { - length = ROUNDUP(length, PG_SIZE); - ptr_t cur_addr = PG_ALIGN(addr); + length = ROUNDUP(length, PAGE_SIZE); + ptr_t cur_addr = va_align(addr); struct mm_region *pos, *n; llist_for_each(pos, n, regions, head) @@ -467,7 +463,7 @@ __DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst) ptr_t addr_ptr = (ptr_t)addr; - if (!length || length > BS_SIZE || !PG_ALIGNED(addr_ptr)) { + if (!length || length > BS_SIZE || va_offset(addr_ptr)) { errno = EINVAL; goto done; } @@ -497,7 +493,7 @@ __DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst) } struct mmap_param param = { .flags = options, - .mlen = ROUNDUP(length, PG_SIZE), + .mlen = ROUNDUP(length, PAGE_SIZE), .offset = offset, .type = REGION_TYPE_GENERAL, .proct = proct, @@ -519,7 +515,7 @@ __DEFINE_LXSYSCALL2(int, munmap, void*, addr, size_t, length) __DEFINE_LXSYSCALL3(int, msync, void*, addr, size_t, length, int, flags) { - if (!PG_ALIGNED(addr) || ((flags & MS_ASYNC) && (flags & MS_SYNC))) { + if (va_offset((ptr_t)addr) || ((flags & MS_ASYNC) && (flags & MS_SYNC))) { return DO_STATUS(EINVAL); } diff --git a/lunaix-os/kernel/mm/mmio.c b/lunaix-os/kernel/mm/mmio.c index ccb57d7..1e262cc 100644 --- a/lunaix-os/kernel/mm/mmio.c +++ b/lunaix-os/kernel/mm/mmio.c @@ -6,12 +6,12 @@ void* ioremap(ptr_t paddr, u32_t size) { - void* ptr = vmap(paddr, size, PG_PREM_RW | PG_DISABLE_CACHE, 0); + // FIXME implement a page policy interface allow to decouple the + // arch-dependent caching behaviour + void* ptr = (void*)vmap(paddr, size, KERNEL_DATA); if (ptr) { - pmm_mark_chunk_occupied(paddr >> PG_SIZE_BITS, - CEIL(size, PG_SIZE_BITS), - PP_FGLOCKED); + pmm_mark_chunk_occupied(pfn(paddr), leaf_count(size), PP_FGLOCKED); } return ptr; @@ -20,8 +20,12 @@ ioremap(ptr_t paddr, u32_t size) void iounmap(ptr_t vaddr, u32_t size) { - for (size_t i = 0; i < size; i += PG_SIZE) { - ptr_t paddr = vmm_del_mapping(VMS_SELF, vaddr + i); - pmm_free_page(paddr); + pte_t* ptep = mkptep_va(VMS_SELF, vaddr); + for (size_t i = 0; i < size; i += PAGE_SIZE, ptep++) { + pte_t pte = pte_at(ptep); + + set_pte(ptep, null_pte); + if (pte_isloaded(pte)) + pmm_free_page(pte_paddr(pte)); } } \ No newline at end of file diff --git a/lunaix-os/kernel/mm/page.c b/lunaix-os/kernel/mm/page.c deleted file mode 100644 index 400197f..0000000 --- a/lunaix-os/kernel/mm/page.c +++ /dev/null @@ -1 +0,0 @@ -#include \ No newline at end of file diff --git a/lunaix-os/kernel/mm/pmm.c b/lunaix-os/kernel/mm/pmm.c index b1cea96..72b57d7 100644 --- a/lunaix-os/kernel/mm/pmm.c +++ b/lunaix-os/kernel/mm/pmm.c @@ -1,6 +1,7 @@ -#include #include #include +#include +#include // This is a very large array... static struct pp_struct pm_table[PM_BMP_MAX_SIZE]; @@ -12,6 +13,9 @@ export_symbol(debug, pmm, max_pg); void pmm_mark_page_free(ptr_t ppn) { + if ((pm_table[ppn].attr & PP_FGLOCKED)) { + return; + } pm_table[ppn].ref_counts = 0; } @@ -26,6 +30,9 @@ void pmm_mark_chunk_free(ptr_t start_ppn, size_t page_count) { for (size_t i = start_ppn; i < start_ppn + page_count && i < max_pg; i++) { + if ((pm_table[i].attr & PP_FGLOCKED)) { + continue; + } pm_table[i].ref_counts = 0; } } @@ -49,7 +56,7 @@ volatile size_t pg_lookup_ptr; void pmm_init(ptr_t mem_upper_lim) { - max_pg = (PG_ALIGN(mem_upper_lim) >> 12); + max_pg = pfn(mem_upper_lim); pg_lookup_ptr = LOOKUP_START; @@ -112,22 +119,16 @@ pmm_alloc_page(pp_attr_t attr) } int -pmm_free_page(ptr_t page) +pmm_free_one(ptr_t page, pp_attr_t attr_mask) { - struct pp_struct* pm = &pm_table[page >> 12]; - - // Is this a MMIO mapping or double free? - if ((page >> 12) >= max_pg || !(pm->ref_counts)) { - return 0; - } + pfn_t ppfn = pfn(page); + struct pp_struct* pm = &pm_table[ppfn]; - // 如果是锁定页,则不作处理 - if ((pm->attr & PP_FGLOCKED)) { + assert(ppfn < max_pg && pm->ref_counts); + if (pm->attr && !(pm->attr & attr_mask)) { return 0; } - // TODO: 检查权限,保证:1) 只有正在使用该页(包括被分享者)的进程可以释放; - // 2) 内核可释放所有页。 pm->ref_counts--; return 1; } @@ -135,21 +136,29 @@ pmm_free_page(ptr_t page) int pmm_ref_page(ptr_t page) { - u32_t ppn = page >> 12; + u32_t ppn = pfn(page); if (ppn >= PM_BMP_MAX_SIZE) { return 0; } struct pp_struct* pm = &pm_table[ppn]; - if (ppn >= max_pg || !pm->ref_counts) { - return 0; - } + assert(ppn < max_pg && pm->ref_counts); pm->ref_counts++; return 1; } +void +pmm_set_attr(ptr_t page, pp_attr_t attr) +{ + struct pp_struct* pp = &pm_table[pfn(page)]; + + if (pp->ref_counts) { + pp->attr = attr; + } +} + struct pp_struct* pmm_query(ptr_t pa) { diff --git a/lunaix-os/kernel/mm/procvm.c b/lunaix-os/kernel/mm/procvm.c index d9e357a..ea49624 100644 --- a/lunaix-os/kernel/mm/procvm.c +++ b/lunaix-os/kernel/mm/procvm.c @@ -6,13 +6,13 @@ #include #include -#include +#include #include struct proc_mm* procvm_create(struct proc_info* proc) { - struct proc_mm* mm = valloc(sizeof(struct proc_mm)); + struct proc_mm* mm = vzalloc(sizeof(struct proc_mm)); assert(mm); @@ -23,122 +23,247 @@ procvm_create(struct proc_info* proc) { return mm; } - static ptr_t -__dup_vmspace(ptr_t mount_point, bool only_kernel) +vmscpy(ptr_t dest_mnt, ptr_t src_mnt, bool only_kernel) { - ptr_t ptd_pp = pmm_alloc_page(PP_FGPERSIST); - vmm_set_mapping(VMS_SELF, PG_MOUNT_1, ptd_pp, PG_PREM_RW, VMAP_NULL); - - x86_page_table* ptd = (x86_page_table*)PG_MOUNT_1; - x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12)); - - size_t kspace_l1inx = L1_INDEX(KERNEL_EXEC); - size_t i = 1; // skip first 4MiB, to avoid bring other thread's stack + pte_t* ptep_dest = mkl0tep(mkptep_va(dest_mnt, 0)); + pte_t* ptep = mkl0tep(mkptep_va(src_mnt, 0)); + pte_t* ptepd_kernel = mkl0tep(mkptep_va(dest_mnt, KERNEL_RESIDENT)); + pte_t* ptep_kernel = mkl0tep(mkptep_va(src_mnt, KERNEL_RESIDENT)); + + // Build the self-reference on dest vms + pte_t* ptep_sms = mkptep_va(VMS_SELF, (ptr_t)ptep_dest); + pte_t* ptep_ssm = mkptep_va(VMS_SELF, (ptr_t)ptep_sms); + pte_t pte_sms = mkpte_prot(KERNEL_DATA); + + pte_sms = vmm_alloc_page(ptep_ssm, pte_sms); + set_pte(ptep_sms, pte_sms); + + cpu_flush_page((ptr_t)dest_mnt); - ptd->entry[0] = 0; if (only_kernel) { - i = kspace_l1inx; - memset(ptd, 0, PG_SIZE); + ptep = ptep_kernel; + ptep_dest += ptep_vfn(ptep_kernel); + } else { + ptep++; + ptep_dest++; } - for (; i < PG_MAX_ENTRIES - 1; i++) { + int level = 0; + while (ptep < ptep_kernel) + { + pte_t pte = *ptep; + ptr_t pa = pte_paddr(pte); + + if (pte_isnull(pte)) { + goto cont; + } + + if (pt_last_level(level) || pte_huge(pte)) { + set_pte(ptep_dest, pte); + + if (pte_isloaded(pte)) + pmm_ref_page(pa); + } + else if (!pt_last_level(level)) { + vmm_alloc_page(ptep_dest, pte); + + ptep = ptep_step_into(ptep); + ptep_dest = ptep_step_into(ptep_dest); + level++; - x86_pte_t ptde = pptd->entry[i]; - // 空或者是未在内存中的L1页表项直接照搬过去。 - // 内核地址空间直接共享过去。 - if (!ptde || i >= kspace_l1inx || !(ptde & PG_PRESENT)) { - ptd->entry[i] = ptde; continue; } + + cont: + if (ptep_vfn(ptep) == MAX_PTEN - 1) { + assert(level > 0); + ptep = ptep_step_out(ptep); + ptep_dest = ptep_step_out(ptep_dest); + level--; + } + + ptep++; + ptep_dest++; + } + + // Ensure we step back to L0T + assert(!level); + assert(ptep_dest == ptepd_kernel); + + // Carry over the kernel (exclude last two entry) + while (ptep_vfn(ptep) < MAX_PTEN - 2) { + pte_t pte = *ptep; + assert(!pte_isnull(pte)); + + set_pte(ptep_dest, pte); + pmm_ref_page(pte_paddr(pte)); + + ptep++; + ptep_dest++; + } + + return pte_paddr(*(ptep_dest + 1)); +} + +static void optimize("O0") +vmsfree(ptr_t vm_mnt) +{ + pte_t* ptep_head = mkl0tep(mkptep_va(vm_mnt, 0)); + pte_t* ptep_kernel = mkl0tep(mkptep_va(vm_mnt, KERNEL_RESIDENT)); + + int level = 0; + volatile pte_t* ptep = ptep_head; + while (ptep < ptep_kernel) + { + pte_t pte = *ptep; + ptr_t pa = pte_paddr(pte); + + if (pte_isnull(pte)) { + goto cont; + } - // 复制L2页表 - ptr_t pt_pp = pmm_alloc_page(PP_FGPERSIST); - vmm_set_mapping(VMS_SELF, PG_MOUNT_2, pt_pp, PG_PREM_RW, VMAP_NULL); + if (!pt_last_level(level) && !pte_huge(pte)) { + ptep = ptep_step_into(ptep); + level++; - x86_page_table* ppt = (x86_page_table*)(mount_point | (i << 12)); - x86_page_table* pt = (x86_page_table*)PG_MOUNT_2; + continue; + } - for (size_t j = 0; j < PG_MAX_ENTRIES; j++) { - x86_pte_t pte = ppt->entry[j]; - pmm_ref_page(PG_ENTRY_ADDR(pte)); - pt->entry[j] = pte; + if (pte_isloaded(pte)) + pmm_free_any(pa); + + cont: + if (ptep_vfn(ptep) == MAX_PTEN - 1) { + ptep = ptep_step_out(ptep); + pmm_free_any(pte_paddr(pte_at(ptep))); + level--; } - ptd->entry[i] = (ptr_t)pt_pp | PG_ENTRY_FLAGS(ptde); + ptep++; } - ptd->entry[PG_MAX_ENTRIES - 1] = NEW_L1_ENTRY(T_SELF_REF_PERM, ptd_pp); + ptr_t self_pa = pte_paddr(ptep_head[MAX_PTEN - 1]); + pmm_free_any(self_pa); +} + +static inline void +__attach_to_current_vms(struct proc_mm* guest_mm) +{ + struct proc_mm* mm_current = vmspace(__current); + if (mm_current) { + assert(!mm_current->guest_mm); + mm_current->guest_mm = guest_mm; + } +} - return ptd_pp; +static inline void +__detach_from_current_vms(struct proc_mm* guest_mm) +{ + struct proc_mm* mm_current = vmspace(__current); + if (mm_current) { + assert(mm_current->guest_mm == guest_mm); + mm_current->guest_mm = NULL; + } } + void -procvm_dup(struct proc_info* proc) { - struct proc_mm* mm = vmspace(proc); - struct proc_mm* mm_current = vmspace(__current); - - mm->heap = mm_current->heap; - mm->vmroot = __dup_vmspace(VMS_SELF, false); +procvm_dupvms_mount(struct proc_mm* mm) { + assert(__current); + assert(!mm->vm_mnt); + + struct proc_mm* mm_current = vmspace(__current); + + __attach_to_current_vms(mm); - region_copy_mm(mm_current, mm); + mm->heap = mm_current->heap; + mm->vm_mnt = VMS_MOUNT_1; + mm->vmroot = vmscpy(VMS_MOUNT_1, VMS_SELF, false); + + region_copy_mm(mm_current, mm); } void -procvm_init_clean(struct proc_info* proc) +procvm_mount(struct proc_mm* mm) { - struct proc_mm* mm = vmspace(proc); - mm->vmroot = __dup_vmspace(VMS_SELF, true); -} + assert(!mm->vm_mnt); + assert(mm->vmroot); + vms_mount(VMS_MOUNT_1, mm->vmroot); -static void -__delete_vmspace(ptr_t vm_mnt) -{ - x86_page_table* pptd = (x86_page_table*)(vm_mnt | (0x3FF << 12)); + __attach_to_current_vms(mm); - // only remove user address space - for (size_t i = 0; i < L1_INDEX(KERNEL_EXEC); i++) { - x86_pte_t ptde = pptd->entry[i]; - if (!ptde || !(ptde & PG_PRESENT)) { - continue; - } + mm->vm_mnt = VMS_MOUNT_1; +} - x86_page_table* ppt = (x86_page_table*)(vm_mnt | (i << 12)); +void +procvm_unmount(struct proc_mm* mm) +{ + assert(mm->vm_mnt); - for (size_t j = 0; j < PG_MAX_ENTRIES; j++) { - x86_pte_t pte = ppt->entry[j]; - // free the 4KB data page - if ((pte & PG_PRESENT)) { - pmm_free_page(PG_ENTRY_ADDR(pte)); - } - } - // free the L2 page table - pmm_free_page(PG_ENTRY_ADDR(ptde)); + vms_unmount(VMS_MOUNT_1); + struct proc_mm* mm_current = vmspace(__current); + if (mm_current) { + mm_current->guest_mm = NULL; } - // free the L1 directory - pmm_free_page(PG_ENTRY_ADDR(pptd->entry[PG_MAX_ENTRIES - 1])); + + mm->vm_mnt = 0; +} + +void +procvm_initvms_mount(struct proc_mm* mm) +{ + assert(!mm->vm_mnt); + + __attach_to_current_vms(mm); + + mm->vm_mnt = VMS_MOUNT_1; + mm->vmroot = vmscpy(VMS_MOUNT_1, VMS_SELF, true); } void -procvm_cleanup(ptr_t vm_mnt, struct proc_info* proc) { +procvm_unmount_release(struct proc_mm* mm) { + ptr_t vm_mnt = mm->vm_mnt; struct mm_region *pos, *n; - llist_for_each(pos, n, vmregions(proc), head) + llist_for_each(pos, n, &mm->regions, head) { mem_sync_pages(vm_mnt, pos, pos->start, pos->end - pos->start, 0); region_release(pos); } - vfree(proc->mm); + vfree(mm); + vmsfree(vm_mnt); + vms_unmount(vm_mnt); + + __detach_from_current_vms(mm); +} + +void +procvm_mount_self(struct proc_mm* mm) +{ + assert(!mm->vm_mnt); + assert(!mm->guest_mm); + + mm->vm_mnt = VMS_SELF; +} + +void +procvm_unmount_self(struct proc_mm* mm) +{ + assert(mm->vm_mnt == VMS_SELF); - __delete_vmspace(vm_mnt); + mm->vm_mnt = 0; } ptr_t procvm_enter_remote(struct remote_vmctx* rvmctx, struct proc_mm* mm, - ptr_t vm_mnt, ptr_t remote_base, size_t size) + ptr_t remote_base, size_t size) { - ptr_t size_pn = PN(size + MEM_PAGE); + ptr_t vm_mnt = mm->vm_mnt; + assert(vm_mnt); + + pfn_t size_pn = pfn(size + MEM_PAGE); assert(size_pn < REMOTEVM_MAX_PAGES); struct mm_region* region = region_get(&mm->regions, remote_base); @@ -147,23 +272,25 @@ procvm_enter_remote(struct remote_vmctx* rvmctx, struct proc_mm* mm, rvmctx->vms_mnt = vm_mnt; rvmctx->page_cnt = size_pn; - remote_base = PG_ALIGN(remote_base); + remote_base = va_align(remote_base); rvmctx->remote = remote_base; rvmctx->local_mnt = PG_MOUNT_4_END + 1; - v_mapping m; - unsigned int pattr = region_ptattr(region); - ptr_t raddr = remote_base, lmnt = rvmctx->local_mnt; - for (size_t i = 0; i < size_pn; i++, lmnt += MEM_PAGE, raddr += MEM_PAGE) + pte_t* rptep = mkptep_va(vm_mnt, remote_base); + pte_t* lptep = mkptep_va(VMS_SELF, rvmctx->local_mnt); + unsigned int pattr = region_pteprot(region); + + for (size_t i = 0; i < size_pn; i++) { - if (vmm_lookupat(vm_mnt, raddr, &m) && PG_IS_PRESENT(m.flags)) { - vmm_set_mapping(VMS_SELF, lmnt, m.pa, PG_PREM_RW, 0); + pte_t pte = vmm_tryptep(rptep, PAGE_SIZE); + if (pte_isloaded(pte)) { + set_pte(lptep, pte); continue; } ptr_t pa = pmm_alloc_page(0); - vmm_set_mapping(VMS_SELF, lmnt, pa, PG_PREM_RW, 0); - vmm_set_mapping(vm_mnt, raddr, pa, pattr, 0); + set_pte(lptep, mkpte(pa, KERNEL_DATA)); + set_pte(rptep, mkpte(pa, pattr)); } return vm_mnt; @@ -179,7 +306,7 @@ procvm_copy_remote_transaction(struct remote_vmctx* rvmctx, } ptr_t offset = remote_dest - rvmctx->remote; - if (PN(offset + sz) >= rvmctx->page_cnt) { + if (pfn(offset + sz) >= rvmctx->page_cnt) { return -1; } @@ -189,11 +316,8 @@ procvm_copy_remote_transaction(struct remote_vmctx* rvmctx, } void -procvm_exit_remote_transaction(struct remote_vmctx* rvmctx) +procvm_exit_remote(struct remote_vmctx* rvmctx) { - ptr_t lmnt = rvmctx->local_mnt; - for (size_t i = 0; i < rvmctx->page_cnt; i++, lmnt += MEM_PAGE) - { - vmm_del_mapping(VMS_SELF, lmnt); - } + pte_t* lptep = mkptep_va(VMS_SELF, rvmctx->local_mnt); + vmm_unset_ptes(lptep, rvmctx->page_cnt); } \ No newline at end of file diff --git a/lunaix-os/kernel/mm/region.c b/lunaix-os/kernel/mm/region.c index a2bf82e..7dead6d 100644 --- a/lunaix-os/kernel/mm/region.c +++ b/lunaix-os/kernel/mm/region.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -11,8 +10,8 @@ struct mm_region* region_create(ptr_t start, ptr_t end, u32_t attr) { - assert_msg(PG_ALIGNED(start), "not page aligned"); - assert_msg(PG_ALIGNED(end), "not page aligned"); + assert_msg(!va_offset(start), "not page aligned"); + assert_msg(!va_offset(end), "not page aligned"); struct mm_region* region = valloc(sizeof(struct mm_region)); *region = (struct mm_region){ .attr = attr, .start = start, .end = end - 1 }; @@ -22,8 +21,8 @@ region_create(ptr_t start, ptr_t end, u32_t attr) struct mm_region* region_create_range(ptr_t start, size_t length, u32_t attr) { - assert_msg(PG_ALIGNED(start), "not page aligned"); - assert_msg(PG_ALIGNED(length), "not page aligned"); + assert_msg(!va_offset(start), "not page aligned"); + assert_msg(!va_offset(length), "not page aligned"); struct mm_region* region = valloc(sizeof(struct mm_region)); *region = (struct mm_region){ .attr = attr, .start = start, @@ -131,7 +130,7 @@ region_get(vm_regions_t* lead, unsigned long vaddr) struct mm_region *pos, *n; - vaddr = PG_ALIGN(vaddr); + vaddr = va_align(vaddr); llist_for_each(pos, n, lead, head) { diff --git a/lunaix-os/kernel/mm/vmap.c b/lunaix-os/kernel/mm/vmap.c index f805adc..02711fb 100644 --- a/lunaix-os/kernel/mm/vmap.c +++ b/lunaix-os/kernel/mm/vmap.c @@ -2,143 +2,70 @@ #include #include #include +#include #include static ptr_t start = VMAP; +static volatile ptr_t prev_va = 0; -void* -vmap(ptr_t paddr, size_t size, pt_attr attr, int flags) +static pte_t* +__alloc_contig_ptes(pte_t* ptep, size_t base_sz, int n) { - // next fit - assert_msg((paddr & 0xfff) == 0, "vmap: bad alignment"); - size = ROUNDUP(size, PG_SIZE); - - ptr_t current_addr = start; - size_t examed_size = 0, wrapped = 0; - x86_page_table* pd = (x86_page_table*)L1_BASE_VADDR; - - while (!wrapped || current_addr < start) { - size_t l1inx = L1_INDEX(current_addr); - if (!(pd->entry[l1inx])) { - // empty 4mb region - examed_size += MEM_4M; - current_addr = (current_addr & 0xffc00000) + MEM_4M; - } else { - x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx)); - size_t i = L2_INDEX(current_addr), j = 0; - for (; i < PG_MAX_ENTRIES && examed_size < size; i++, j++) { - if (!ptd->entry[i]) { - examed_size += PG_SIZE; - } else if (examed_size) { - // found a discontinuity, start from beginning - examed_size = 0; - j++; - break; - } - } - current_addr += j << 12; - } - - if (examed_size >= size) { - goto done; + int _n = 0; + size_t sz = L0T_SIZE; + ptr_t va = page_addr(ptep_pfn(ptep)); + + ptep = mkl0tep(ptep); + + while (_n < n && va < VMAP_END) { + pte_t pte = *ptep; + if (pte_isnull(pte)) { + _n += sz / base_sz; + } + else if ((sz / LEVEL_SIZE) < base_sz) { + _n = 0; } - - if (current_addr >= VMAP_END) { - wrapped = 1; - examed_size = 0; - current_addr = VMAP; + else { + sz = sz / LEVEL_SIZE; + ptep = ptep_step_into(ptep); + continue; } - } - - return NULL; -done: - ptr_t alloc_begin = current_addr - examed_size; - start = alloc_begin + size; - - if ((flags & VMAP_NOMAP)) { - for (size_t i = 0; i < size; i += PG_SIZE) { - vmm_set_mapping(VMS_SELF, alloc_begin + i, -1, 0, 0); + if (ptep_vfn(ptep) + 1 == LEVEL_SIZE) { + ptep = ptep_step_out(++ptep); + va += sz; + + sz = sz * LEVEL_SIZE; + continue; } - - return (void*)alloc_begin; - } - - for (size_t i = 0; i < size; i += PG_SIZE) { - vmm_set_mapping(VMS_SELF, alloc_begin + i, paddr + i, attr, 0); - pmm_ref_page(paddr + i); + + va += sz; + ptep++; } - return (void*)alloc_begin; -} - -/* - This is a kernel memory region that represent a contiguous virtual memory - address such that all memory allocation/deallocation can be concentrated - into a single big chunk, which will help to mitigate the external - fragmentation in the VMAP address domain. It is significant if our - allocation granule is single page or in some use cases. - - XXX (vmap_area) - A potential performance improvement on pcache? (need more analysis!) - -> In exchange of a fixed size buffer pool. (does it worth?) -*/ - -struct vmap_area* -vmap_varea(size_t size, pt_attr attr) -{ - ptr_t start = (ptr_t)vmap(0, size, attr ^ PG_PRESENT, VMAP_NOMAP); - - if (!start) { + if (va >= VMAP_END) { return NULL; } - struct vmap_area* varea = valloc(sizeof(struct vmap_area)); - *varea = - (struct vmap_area){ .start = start, .size = size, .area_attr = attr }; - - return varea; + va -= base_sz * _n; + assert(prev_va < va); + + prev_va = va; + return mkptep_va(ptep_vm_mnt(ptep), va); } ptr_t -vmap_area_page(struct vmap_area* area, ptr_t paddr, pt_attr attr) +vmap_ptes_at(pte_t pte, size_t lvl_size, int n) { - ptr_t current = area->start; - size_t bound = current + area->size; + pte_t* ptep = mkptep_va(VMS_SELF, start); + ptep = __alloc_contig_ptes(ptep, lvl_size, n); - while (current < bound) { - x86_pte_t* pte = - (x86_pte_t*)(L2_VADDR(L1_INDEX(current)) | L2_INDEX(current)); - if (PG_IS_PRESENT(*pte)) { - current += PG_SIZE; - continue; - } - - *pte = NEW_L2_ENTRY(attr | PG_PRESENT, paddr); - cpu_flush_page(current); - break; - } - - return current; -} - -ptr_t -vmap_area_rmpage(struct vmap_area* area, ptr_t vaddr) -{ - ptr_t current = area->start; - size_t bound = current + area->size; - - if (current > vaddr || vaddr > bound) { + if (!ptep) { return 0; } - x86_pte_t* pte = - (x86_pte_t*)(L2_VADDR(L1_INDEX(current)) | L2_INDEX(current)); - ptr_t pa = PG_ENTRY_ADDR(*pte); - - *pte = NEW_L2_ENTRY(0, -1); - cpu_flush_page(current); + vmm_set_ptes_contig(ptep, pte, lvl_size, n); - return pa; + return page_addr(ptep_pfn(ptep)); } \ No newline at end of file diff --git a/lunaix-os/kernel/mm/vmm.c b/lunaix-os/kernel/mm/vmm.c index 5e09e9d..6b497b8 100644 --- a/lunaix-os/kernel/mm/vmm.c +++ b/lunaix-os/kernel/mm/vmm.c @@ -7,7 +7,7 @@ #include #include -LOG_MODULE("VMM") +LOG_MODULE("VM") void vmm_init() @@ -15,217 +15,138 @@ vmm_init() // XXX: something here? } -x86_page_table* -vmm_init_pd() +pte_t +vmm_alloc_page(pte_t* ptep, pte_t pte) { - x86_page_table* dir = - (x86_page_table*)pmm_alloc_page(PP_FGPERSIST); - for (size_t i = 0; i < PG_MAX_ENTRIES; i++) { - dir->entry[i] = PTE_NULL; + ptr_t pa = pmm_alloc_page(PP_FGPERSIST); + if (!pa) { + return null_pte; } - // 递归映射,方便我们在软件层面进行查表地址转换 - dir->entry[PG_MAX_ENTRIES - 1] = NEW_L1_ENTRY(T_SELF_REF_PERM, dir); + pte = pte_setpaddr(pte, pa); + pte = pte_mkloaded(pte); + set_pte(ptep, pte); - return dir; + mount_page(PG_MOUNT_1, pa); + memset((void*)PG_MOUNT_1, 0, LFT_SIZE); + unmount_page(PG_MOUNT_1); + + cpu_flush_page((ptr_t)ptep); + + return pte; } int -vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options) +vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pte_attr_t prot) { - assert((ptr_t)va % PG_SIZE == 0); - - ptr_t l1_inx = L1_INDEX(va); - ptr_t l2_inx = L2_INDEX(va); - x86_page_table* l1pt = (x86_page_table*)(mnt | (1023 << 12)); - x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_inx << 12)); - - // See if attr make sense - assert(attr <= 128); - - x86_pte_t* l1pte = &l1pt->entry[l1_inx]; - if (!*l1pte) { - x86_page_table* new_l1pt_pa = - (x86_page_table*)pmm_alloc_page(PP_FGPERSIST); - - // 物理内存已满! - if (!new_l1pt_pa) { - return 0; - } - - // This must be writable - *l1pte = NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa); - - // make sure our new l2 table is visible to CPU - cpu_flush_page((ptr_t)l2pt); - - memset((void*)l2pt, 0, PG_SIZE); - } else { - if ((attr & PG_ALLOW_USER) && !(*l1pte & PG_ALLOW_USER)) { - *l1pte |= PG_ALLOW_USER; - } - - x86_pte_t pte = l2pt->entry[l2_inx]; - if (pte && (options & VMAP_IGNORE)) { - return 1; - } - } + assert(!va_offset(va)); - if (mnt == VMS_SELF) { - cpu_flush_page(va); - } + pte_t* ptep = mkptep_va(mnt, va); + pte_t pte = mkpte(pa, prot); - if ((options & VMAP_NOMAP)) { - return 1; - } + set_pte(ptep, pte); - if (!(options & VMAP_GUARDPAGE)) { - l2pt->entry[l2_inx] = NEW_L2_ENTRY(attr, pa); - } else { - l2pt->entry[l2_inx] = MEMGUARD; - } - return 1; } ptr_t vmm_del_mapping(ptr_t mnt, ptr_t va) { - assert(((ptr_t)va & 0xFFFU) == 0); - - u32_t l1_index = L1_INDEX(va); - u32_t l2_index = L2_INDEX(va); - - // prevent unmap of recursive mapping region - if (l1_index == 1023) { - return 0; - } + assert(!va_offset(va)); - x86_page_table* l1pt = (x86_page_table*)(mnt | (1023 << 12)); + pte_t* ptep = mkptep_va(mnt, va); - x86_pte_t l1pte = l1pt->entry[l1_index]; - - if (l1pte) { - x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_index << 12)); - x86_pte_t l2pte = l2pt->entry[l2_index]; - - cpu_flush_page(va); - l2pt->entry[l2_index] = PTE_NULL; - - return PG_ENTRY_ADDR(l2pte); - } - - return 0; -} - -int -vmm_lookup(ptr_t va, v_mapping* mapping) -{ - return vmm_lookupat(VMS_SELF, va, mapping); -} + pte_t old = *ptep; -int -vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping) -{ - u32_t l1_index = L1_INDEX(va); - u32_t l2_index = L2_INDEX(va); - - x86_page_table* l1pt = (x86_page_table*)(mnt | 1023 << 12); - x86_pte_t l1pte = l1pt->entry[l1_index]; - - if (l1pte) { - x86_pte_t* l2pte = - &((x86_page_table*)(mnt | (l1_index << 12)))->entry[l2_index]; - - if (l2pte) { - mapping->flags = PG_ENTRY_FLAGS(*l2pte); - mapping->pa = PG_ENTRY_ADDR(*l2pte); - mapping->pn = mapping->pa >> PG_SIZE_BITS; - mapping->pte = l2pte; - mapping->va = va; - return 1; - } - } + set_pte(ptep, null_pte); - return 0; + return pte_paddr(old); } -ptr_t -vmm_v2p(ptr_t va) +pte_t +vmm_tryptep(pte_t* ptep, size_t lvl_size) { - u32_t l1_index = L1_INDEX(va); - u32_t l2_index = L2_INDEX(va); - - x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR; - x86_pte_t l1pte = l1pt->entry[l1_index]; - - if (l1pte) { - x86_pte_t* l2pte = - &((x86_page_table*)L2_VADDR(l1_index))->entry[l2_index]; - - if (l2pte) { - return PG_ENTRY_ADDR(*l2pte) | ((ptr_t)va & 0xfff); - } - } - return 0; + ptr_t va = ptep_va(ptep, lvl_size); + pte_t* _ptep = mkl0tep(ptep); + pte_t pte; + + if (pte_isnull(pte = *_ptep) || _ptep == ptep) + return pte; + +#if LnT_ENABLED(1) + _ptep = getl1tep(_ptep, va); + if (_ptep == ptep || pte_isnull(pte = *_ptep)) + return pte; +#endif +#if LnT_ENABLED(2) + _ptep = getl2tep(_ptep, va); + if (_ptep == ptep || pte_isnull(pte = *_ptep)) + return pte; +#endif +#if LnT_ENABLED(3) + _ptep = getl3tep(_ptep, va); + if (_ptep == ptep || pte_isnull(pte = *_ptep)) + return pte; +#endif + _ptep = getlftep(_ptep, va); + return *_ptep; } ptr_t vmm_v2pat(ptr_t mnt, ptr_t va) { - u32_t l1_index = L1_INDEX(va); - u32_t l2_index = L2_INDEX(va); - - x86_page_table* l1pt = (x86_page_table*)(mnt | 1023 << 12); - x86_pte_t l1pte = l1pt->entry[l1_index]; - - if (l1pte) { - x86_pte_t* l2pte = - &((x86_page_table*)(mnt | (l1_index << 12)))->entry[l2_index]; + ptr_t va_off = va_offset(va); + pte_t* ptep = mkptep_va(mnt, va); - if (l2pte) { - return PG_ENTRY_ADDR(*l2pte) | ((ptr_t)va & 0xfff); - } - } - return 0; + return pte_paddr(pte_at(ptep)) + va_off; } ptr_t -vmm_mount_pd(ptr_t mnt, ptr_t pde) +vms_mount(ptr_t mnt, ptr_t vms_root) { - assert(pde); + assert(vms_root); - x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR; - l1pt->entry[(mnt >> 22)] = NEW_L1_ENTRY(T_SELF_REF_PERM, pde); + pte_t* ptep = mkl0tep_va(VMS_SELF, mnt); + set_pte(ptep, mkpte(vms_root, KERNEL_DATA)); cpu_flush_page(mnt); return mnt; } ptr_t -vmm_unmount_pd(ptr_t mnt) +vms_unmount(ptr_t mnt) { - x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR; - l1pt->entry[(mnt >> 22)] = 0; + pte_t* ptep = mkl0tep_va(VMS_SELF, mnt); + set_pte(ptep, null_pte); cpu_flush_page(mnt); return mnt; } -ptr_t -vmm_dup_page(ptr_t pa) + +void +ptep_alloc_hierarchy(pte_t* ptep, ptr_t va, pte_attr_t prot) { - ptr_t new_ppg = pmm_alloc_page(0); - vmm_set_mapping(VMS_SELF, PG_MOUNT_3, new_ppg, PG_PREM_RW, VMAP_NULL); - vmm_set_mapping(VMS_SELF, PG_MOUNT_4, pa, PG_PREM_RW, VMAP_NULL); + pte_t* _ptep; + + _ptep = mkl0tep(ptep); + if (_ptep == ptep) { + return; + } - asm volatile("movl %1, %%edi\n" - "movl %2, %%esi\n" - "rep movsl\n" ::"c"(1024), - "r"(PG_MOUNT_3), - "r"(PG_MOUNT_4) - : "memory", "%edi", "%esi"); + _ptep = mkl1t(_ptep, va, prot); + if (_ptep == ptep) { + return; + } - vmm_del_mapping(VMS_SELF, PG_MOUNT_3); - vmm_del_mapping(VMS_SELF, PG_MOUNT_4); + _ptep = mkl2t(_ptep, va, prot); + if (_ptep == ptep) { + return; + } + + _ptep = mkl3t(_ptep, va, prot); + if (_ptep == ptep) { + return; + } - return new_ppg; + _ptep = mklft(_ptep, va, prot); + assert(_ptep == ptep); } \ No newline at end of file diff --git a/lunaix-os/kernel/process/fork.c b/lunaix-os/kernel/process/fork.c index f087028..9518c19 100644 --- a/lunaix-os/kernel/process/fork.c +++ b/lunaix-os/kernel/process/fork.c @@ -25,24 +25,21 @@ region_maybe_cow(struct mm_region* region) return; } - ptr_t start_vpn = PN(region->start); - ptr_t end_vpn = PN(region->end); - for (size_t i = start_vpn; i <= end_vpn; i++) { - x86_pte_t* curproc = &PTE_MOUNTED(VMS_SELF, i); - x86_pte_t* newproc = &PTE_MOUNTED(VMS_MOUNT_1, i); + pfn_t start_pn = pfn(region->start); + pfn_t end_pn = pfn(region->end); + + for (size_t i = start_pn; i <= end_pn; i++) { + pte_t* self = mkptep_pn(VMS_SELF, i); + pte_t* guest = mkptep_pn(VMS_MOUNT_1, i); - cpu_flush_page((ptr_t)newproc); + cpu_flush_page(page_addr(ptep_pfn(self))); if ((attr & REGION_MODE_MASK) == REGION_RSHARED) { - // 如果读共享,则将两者的都标注为只读,那么任何写入都将会应用COW策略。 - cpu_flush_page((ptr_t)curproc); - cpu_flush_page((ptr_t)(i << 12)); - - *curproc = *curproc & ~PG_WRITE; - *newproc = *newproc & ~PG_WRITE; + set_pte(self, pte_mkwprotect(*self)); + set_pte(guest, pte_mkwprotect(*guest)); } else { // 如果是私有页,则将该页从新进程中移除。 - *newproc = 0; + set_pte(guest, null_pte); } } } @@ -62,22 +59,24 @@ __dup_fdtable(struct proc_info* pcb) static void __dup_kernel_stack(struct thread* thread, ptr_t vm_mnt) { - ptr_t kstack_pn = PN(current_thread->kstack); + ptr_t kstack_pn = pfn(current_thread->kstack); + kstack_pn -= pfn(KSTACK_SIZE) - 1; // copy the kernel stack - for (size_t i = 0; i < PN(KSTACK_SIZE); i++) { - volatile x86_pte_t* orig_ppte = &PTE_MOUNTED(VMS_SELF, kstack_pn); - x86_pte_t p = *orig_ppte; - ptr_t kstack = kstack_pn * PG_SIZE; + pte_t* src_ptep = mkptep_pn(VMS_SELF, kstack_pn); + pte_t* dest_ptep = mkptep_pn(vm_mnt, kstack_pn); + for (size_t i = 0; i < pfn(KSTACK_SIZE); i++) { + pte_t p = *src_ptep; - if (guardian_page(p)) { - vmm_set_mapping(vm_mnt, kstack, 0, 0, VMAP_GUARDPAGE); + if (pte_isguardian(p)) { + set_pte(dest_ptep, guard_pte); } else { - ptr_t ppa = vmm_dup_page(PG_ENTRY_ADDR(p)); - vmm_set_mapping(vm_mnt, kstack, ppa, p & 0xfff, 0); + ptr_t ppa = vmm_dup_page(pte_paddr(p)); + set_pte(dest_ptep, pte_setpaddr(p, ppa)); } - kstack_pn--; + src_ptep++; + dest_ptep++; } } @@ -166,14 +165,14 @@ dup_proc() } __dup_fdtable(pcb); - procvm_dup(pcb); - vmm_mount_pd(VMS_MOUNT_1, vmroot(pcb)); + struct proc_mm* mm = vmspace(pcb); + procvm_dupvms_mount(mm); struct thread* main_thread = dup_active_thread(VMS_MOUNT_1, pcb); if (!main_thread) { syscall_result(ENOMEM); - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); delete_process(pcb); return -1; } @@ -185,7 +184,7 @@ dup_proc() region_maybe_cow(pos); } - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); commit_process(pcb); commit_thread(main_thread); diff --git a/lunaix-os/kernel/process/process.c b/lunaix-os/kernel/process/process.c index 91fe240..cdaa12a 100644 --- a/lunaix-os/kernel/process/process.c +++ b/lunaix-os/kernel/process/process.c @@ -61,23 +61,22 @@ int spawn_process(struct thread** created, ptr_t entry, bool with_ustack) { struct proc_info* kproc = alloc_process(); + struct proc_mm* mm = vmspace(kproc); - procvm_init_clean(kproc); - - vmm_mount_pd(VMS_MOUNT_1, vmroot(kproc)); + procvm_initvms_mount(mm); - struct thread* kthread = create_thread(kproc, VMS_MOUNT_1, with_ustack); + struct thread* kthread = create_thread(kproc, with_ustack); if (!kthread) { - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); delete_process(kproc); return -1; } commit_process(kproc); - start_thread(kthread, VMS_MOUNT_1, entry); + start_thread(kthread, entry); - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); if (created) { *created = kthread; @@ -92,17 +91,16 @@ spawn_process_usr(struct thread** created, char* path, { // FIXME remote injection of user stack not yet implemented - struct proc_info* proc = alloc_process(); + struct proc_info* proc = alloc_process(); + struct proc_mm* mm = vmspace(proc); assert(!kernel_process(proc)); - procvm_init_clean(proc); - - vmm_mount_pd(VMS_MOUNT_1, vmroot(proc)); + procvm_initvms_mount(mm); int errno = 0; struct thread* main_thread; - if (!(main_thread = create_thread(proc, VMS_MOUNT_1, true))) { + if (!(main_thread = create_thread(proc, true))) { errno = ENOMEM; goto fail; } @@ -114,17 +112,17 @@ spawn_process_usr(struct thread** created, char* path, } commit_process(proc); - start_thread(main_thread, VMS_MOUNT_1, container.exe.entry); + start_thread(main_thread, container.exe.entry); if (created) { *created = main_thread; } - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); return 0; fail: - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount(mm); delete_process(proc); return errno; } diff --git a/lunaix-os/kernel/process/sched.c b/lunaix-os/kernel/process/sched.c index c92cde9..bdd9736 100644 --- a/lunaix-os/kernel/process/sched.c +++ b/lunaix-os/kernel/process/sched.c @@ -23,8 +23,10 @@ #include +struct thread empty_thread_obj; + volatile struct proc_info* __current; -volatile struct thread* current_thread; +volatile struct thread* current_thread = &empty_thread_obj; struct scheduler sched_ctx; @@ -53,6 +55,7 @@ run(struct thread* thread) thread->process->state = PS_RUNNING; thread->process->th_active = thread; + procvm_mount_self(vmspace(thread->process)); set_current_executing(thread); switch_context(); @@ -80,9 +83,11 @@ cleanup_detached_threads() { continue; } - vmm_mount_pd(VMS_MOUNT_1, vmroot(pos->process)); - destory_thread(VMS_MOUNT_1, pos); - vmm_unmount_pd(VMS_MOUNT_1); + struct proc_mm* mm = vmspace(pos->process); + + procvm_mount(mm); + destory_thread(pos); + procvm_unmount(mm); i++; } @@ -173,8 +178,10 @@ schedule() if (!(current_thread->state & ~PS_RUNNING)) { current_thread->state = PS_READY; __current->state = PS_READY; + } + procvm_unmount_self(vmspace(__current)); check_sleepers(); // round-robin scheduler @@ -447,7 +454,7 @@ commit_process(struct proc_info* process) } void -destory_thread(ptr_t vm_mnt, struct thread* thread) +destory_thread(struct thread* thread) { cake_ensure_valid(thread); @@ -458,7 +465,7 @@ destory_thread(ptr_t vm_mnt, struct thread* thread) llist_delete(&thread->sleep.sleepers); waitq_cancel_wait(&thread->waitqueue); - thread_release_mem(thread, vm_mnt); + thread_release_mem(thread); proc->thread_count--; sched_ctx.ttable_len--; @@ -470,6 +477,7 @@ void delete_process(struct proc_info* proc) { pid_t pid = proc->pid; + struct proc_mm* mm = vmspace(proc); assert(pid); // long live the pid0 !! @@ -503,17 +511,15 @@ delete_process(struct proc_info* proc) signal_free_registers(proc->sigreg); - vmm_mount_pd(VMS_MOUNT_1, vmroot(proc)); + procvm_mount(mm); struct thread *pos, *n; llist_for_each(pos, n, &proc->threads, proc_sibs) { // terminate and destory all thread unconditionally - destory_thread(VMS_MOUNT_1, pos); + destory_thread(pos); } - procvm_cleanup(VMS_MOUNT_1, proc); - - vmm_unmount_pd(VMS_MOUNT_1); + procvm_unmount_release(mm); cake_release(proc_pile, proc); } diff --git a/lunaix-os/kernel/process/signal.c b/lunaix-os/kernel/process/signal.c index a132de8..9f5357e 100644 --- a/lunaix-os/kernel/process/signal.c +++ b/lunaix-os/kernel/process/signal.c @@ -11,8 +11,6 @@ #include -// FIXME issues with signal - LOG_MODULE("SIG") extern struct scheduler sched_ctx; /* kernel/sched.c */ diff --git a/lunaix-os/kernel/process/thread.c b/lunaix-os/kernel/process/thread.c index 97e37a2..e74718e 100644 --- a/lunaix-os/kernel/process/thread.c +++ b/lunaix-os/kernel/process/thread.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -15,12 +14,6 @@ LOG_MODULE("THREAD") -static inline void -inject_guardian_page(ptr_t vm_mnt, ptr_t va) -{ - vmm_set_mapping(vm_mnt, PG_ALIGN(va), 0, 0, VMAP_GUARDPAGE); -} - static ptr_t __alloc_user_thread_stack(struct proc_info* proc, struct mm_region** stack_region, ptr_t vm_mnt) { @@ -43,65 +36,63 @@ __alloc_user_thread_stack(struct proc_info* proc, struct mm_region** stack_regio return 0; } - // Pre-allocate a page contains stack top, to avoid immediate trap to kernel - // upon thread execution - ptr_t pa = pmm_alloc_page(0); - ptr_t stack_top = align_stack(th_stack_top + USR_STACK_SIZE - 1); - if (likely(pa)) { - vmm_set_mapping(vm_mnt, PG_ALIGN(stack_top), - pa, region_ptattr(vmr), 0); - } - - inject_guardian_page(vm_mnt, vmr->start); + set_pte(mkptep_va(vm_mnt, vmr->start), guard_pte); *stack_region = vmr; + ptr_t stack_top = align_stack(th_stack_top + USR_STACK_SIZE - 1); return stack_top; } static ptr_t __alloc_kernel_thread_stack(struct proc_info* proc, ptr_t vm_mnt) { - v_mapping mapping; - ptr_t kstack = PG_ALIGN(KSTACK_AREA_END - KSTACK_SIZE); - while (kstack >= KSTACK_AREA) { + pfn_t kstack_top = leaf_count(KSTACK_AREA_END); + pfn_t kstack_end = pfn(KSTACK_AREA); + pte_t* ptep = mkptep_pn(vm_mnt, kstack_top); + while (ptep_pfn(ptep) > kstack_end) { + ptep -= KSTACK_PAGES; + // first page in the kernel stack is guardian page - if (!vmm_lookupat(vm_mnt, kstack + MEM_PAGE, &mapping) - || !PG_IS_PRESENT(mapping.flags)) - { - break; + pte_t pte = *(ptep + 1); + if (pte_isnull(pte)) { + goto found; } - - kstack -= KSTACK_SIZE; } - if (kstack < KSTACK_AREA) { - WARN("failed to create kernel stack: max stack num reach\n"); - return 0; - } + WARN("failed to create kernel stack: max stack num reach\n"); + return 0; - ptr_t pa = pmm_alloc_cpage(PN(KSTACK_SIZE) - 1, 0); +found:; + ptr_t pa = pmm_alloc_cpage(KSTACK_PAGES - 1, 0); if (!pa) { WARN("failed to create kernel stack: nomem\n"); return 0; } - inject_guardian_page(vm_mnt, kstack); - for (size_t i = MEM_PAGE, j = 0; i < KSTACK_SIZE; i+=MEM_PAGE, j+=MEM_PAGE) { - vmm_set_mapping(vm_mnt, kstack + i, pa + j, PG_PREM_RW, 0); - } + set_pte(ptep, guard_pte); + + pte_t pte = mkpte(pa, KERNEL_DATA); + vmm_set_ptes_contig(ptep + 1, pte, LFT_SIZE, KSTACK_PAGES - 1); - return align_stack(kstack + KSTACK_SIZE - 1); + ptep += KSTACK_PAGES; + return align_stack(ptep_va(ptep, LFT_SIZE) - 1); } void -thread_release_mem(struct thread* thread, ptr_t vm_mnt) +thread_release_mem(struct thread* thread) { - for (size_t i = 0; i < KSTACK_SIZE; i+=MEM_PAGE) { - ptr_t stack_page = PG_ALIGN(thread->kstack - i); - vmm_del_mapping(vm_mnt, stack_page); - } + struct proc_mm* mm = vmspace(thread->process); + ptr_t vm_mnt = mm->vm_mnt; + + // Ensure we have mounted + assert(vm_mnt); + + pte_t* ptep = mkptep_va(vm_mnt, thread->kstack); + + ptep -= KSTACK_PAGES - 1; + vmm_unset_ptes(ptep, KSTACK_PAGES); if (thread->ustack) { if ((thread->ustack->start & 0xfff)) { @@ -112,8 +103,12 @@ thread_release_mem(struct thread* thread, ptr_t vm_mnt) } struct thread* -create_thread(struct proc_info* proc, ptr_t vm_mnt, bool with_ustack) +create_thread(struct proc_info* proc, bool with_ustack) { + struct proc_mm* mm = vmspace(proc); + assert(mm->vm_mnt); + + ptr_t vm_mnt = mm->vm_mnt; struct mm_region* ustack_region = NULL; if (with_ustack && !(__alloc_user_thread_stack(proc, &ustack_region, vm_mnt))) @@ -139,9 +134,12 @@ create_thread(struct proc_info* proc, ptr_t vm_mnt, bool with_ustack) } void -start_thread(struct thread* th, ptr_t vm_mnt, ptr_t entry) +start_thread(struct thread* th, ptr_t entry) { assert(th && entry); + struct proc_mm* mm = vmspace(th->process); + + assert(mm->vm_mnt); struct transfer_context transfer; if (!kernel_addr(entry)) { @@ -157,7 +155,7 @@ start_thread(struct thread* th, ptr_t vm_mnt, ptr_t entry) thread_create_kernel_transfer(&transfer, th->kstack, entry); } - inject_transfer_context(vm_mnt, &transfer); + inject_transfer_context(mm->vm_mnt, &transfer); th->intr_ctx = (isr_param*)transfer.inject; commit_thread(th); @@ -185,12 +183,12 @@ thread_find(struct proc_info* proc, tid_t tid) __DEFINE_LXSYSCALL4(int, th_create, tid_t*, tid, struct uthread_info*, thinfo, void*, entry, void*, param) { - struct thread* th = create_thread(__current, VMS_SELF, true); + struct thread* th = create_thread(__current, true); if (!th) { return EAGAIN; } - start_thread(th, VMS_SELF, (ptr_t)entry); + start_thread(th, (ptr_t)entry); ptr_t ustack_top = th->ustack_top; *((void**)ustack_top) = param; @@ -234,7 +232,7 @@ __DEFINE_LXSYSCALL2(int, th_join, tid_t, tid, void**, val_ptr) *val_ptr = (void*)th->exit_val; } - destory_thread(VMS_SELF, th); + destory_thread(th); return 0; } diff --git a/lunaix-os/kernel/spike.c b/lunaix-os/kernel/spike.c index ad751e1..91fe9f6 100644 --- a/lunaix-os/kernel/spike.c +++ b/lunaix-os/kernel/spike.c @@ -1,19 +1,19 @@ #include #include #include +#include +#include -static char buffer[1024]; +LOG_MODULE("spike") void noret __assert_fail(const char* expr, const char* file, unsigned int line) { - ksprintf(buffer, "%s (%s:%u)", expr, file, line); - - // Here we load the buffer's address into %edi ("D" constraint) - // This is a convention we made that the LUNAIX_SYS_PANIC syscall will - // print the panic message passed via %edi. (see - // kernel/asm/x86/interrupts.c) - cpu_trap_panic(buffer); + // Don't do another trap, print it right-away, allow + // the stack context being preserved + cpu_disable_interrupt(); + ERROR("assertion fail (%s:%u)\n\t%s", file, line, expr); + trace_printstack(); spin(); // never reach } @@ -24,15 +24,3 @@ panick(const char* msg) cpu_trap_panic(msg); spin(); } - -void -panickf(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - ksnprintfv(buffer, fmt, 1024, args); - va_end(args); - - asm("int %0" ::"i"(LUNAIX_SYS_PANIC), "D"(buffer)); - spin(); -} diff --git a/lunaix-os/link/linker.ld b/lunaix-os/link/linker.ld index a409542..34833f0 100644 --- a/lunaix-os/link/linker.ld +++ b/lunaix-os/link/linker.ld @@ -2,6 +2,7 @@ ENTRY(start_) SECTIONS { . = 0x100000; + __kboot_start = .; /* 这里是我们的高半核初始化代码段和数据段 */ .boot.text BLOCK(4K) : @@ -29,7 +30,7 @@ SECTIONS { { *(.boot.rodata) } - __kexec_boot_end = ALIGN(4K); + __kboot_end = ALIGN(4K); /* ---- boot end ---- */ diff --git a/lunaix-os/makeinc/qemu.mkinc b/lunaix-os/makeinc/qemu.mkinc index e81f3fa..1fc8a91 100644 --- a/lunaix-os/makeinc/qemu.mkinc +++ b/lunaix-os/makeinc/qemu.mkinc @@ -2,6 +2,7 @@ QEMU_MON_TERM := gnome-terminal QEMU_MON_PORT := 45454 get_qemu_options = -s -S -m 1G \ + -smp 1 \ -rtc base=utc \ -no-reboot \ -machine q35 \ @@ -14,4 +15,4 @@ get_qemu_options = -s -S -m 1G \ -drive id=cdrom,file="$(1)",readonly=on,if=none,format=raw \ -device ahci,id=ahci \ -device ide-cd,drive=cdrom,bus=ahci.0 \ - -monitor telnet::$(QEMU_MON_PORT),server,nowait & \ No newline at end of file + -monitor telnet::$(QEMU_MON_PORT),server,nowait,logfile=qm.log & \ No newline at end of file diff --git a/lunaix-os/makeinc/toolchain.mkinc b/lunaix-os/makeinc/toolchain.mkinc index c63f846..7421f45 100644 --- a/lunaix-os/makeinc/toolchain.mkinc +++ b/lunaix-os/makeinc/toolchain.mkinc @@ -9,7 +9,8 @@ STRIP_OSDEP_LD := -nostdlib -nolibc -z noexecstack -no-pie -Wl,--build-id=none ARCH_OPT := -m32 -D__ARCH_IA32 O := -O2 -W := -Wall -Wextra -Werror -Wno-unknown-pragmas \ +W := -Wall -Wextra -Werror \ + -Wno-unknown-pragmas \ -Wno-unused-function \ -Wno-unused-variable\ -Wno-unused-but-set-variable \ diff --git a/lunaix-os/scripts/gdb/lunadbg/__init__.py b/lunaix-os/scripts/gdb/lunadbg/__init__.py index 0bd147c..b1bf38a 100644 --- a/lunaix-os/scripts/gdb/lunadbg/__init__.py +++ b/lunaix-os/scripts/gdb/lunadbg/__init__.py @@ -7,9 +7,12 @@ from .region_dump import MemoryRegionDump from .sched_dump import ProcessDump, SchedulerDump from .mem import MMStats from .syslog import SysLogDump +from .pte_utils import PteInterpreter, PtepInterpreter MemoryRegionDump() SchedulerDump() ProcessDump() SysLogDump() MMStats() +PtepInterpreter() +PteInterpreter() \ No newline at end of file diff --git a/lunaix-os/scripts/gdb/lunadbg/arch/x86/__init__.py b/lunaix-os/scripts/gdb/lunadbg/arch/x86/__init__.py index 68cf165..2ee9e2d 100644 --- a/lunaix-os/scripts/gdb/lunadbg/arch/x86/__init__.py +++ b/lunaix-os/scripts/gdb/lunadbg/arch/x86/__init__.py @@ -1,6 +1,6 @@ import os -if os.environ["LUNADBG_ARCH"] == 'x86_32': - from .pte import PageTableHelper32 as PageTableHelper -else: +if os.environ["LUNADBG_ARCH"] == 'x86_64': from .pte import PageTableHelper64 as PageTableHelper +else: + from .pte import PageTableHelper32 as PageTableHelper diff --git a/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py b/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py index 5785376..444cb3f 100644 --- a/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py +++ b/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py @@ -38,23 +38,31 @@ class PageTableHelperBase: @staticmethod def vaddr_width(): raise NotImplementedError() + + @staticmethod + def pte_size(): + raise NotImplementedError() class PageTableHelper32(PageTableHelperBase): @staticmethod def translation_level(level = -1): return [0, 1][level] + @staticmethod + def pgtable_len(): + return (1 << 10) + @staticmethod def translation_shift_bits(level): - return [9, 0][level] + 12 + return [10, 0][level] + 12 @staticmethod def mapping_present(pte): return bool(pte & 1) @staticmethod - def huge_page(pte): - return bool(pte & (1 << 7)) + def huge_page(pte, po): + return bool(pte & (1 << 7)) and po @staticmethod def protections(pte): @@ -96,6 +104,10 @@ class PageTableHelper32(PageTableHelperBase): @staticmethod def vaddr_width(): return 32 + + @staticmethod + def pte_size(): + return 4 class PageTableHelper64(PageTableHelperBase): pass \ No newline at end of file diff --git a/lunaix-os/scripts/gdb/lunadbg/commands.py b/lunaix-os/scripts/gdb/lunadbg/commands.py index 9df5983..ec3fe82 100644 --- a/lunaix-os/scripts/gdb/lunadbg/commands.py +++ b/lunaix-os/scripts/gdb/lunadbg/commands.py @@ -1,6 +1,7 @@ from gdb import Command, COMMAND_USER import argparse +import shlex class LunadbgCommand(Command): def __init__(self, name: str) -> None: @@ -8,10 +9,21 @@ class LunadbgCommand(Command): self._parser = argparse.ArgumentParser() def _parse_args(self, gdb_argstr: str): - args, argv = self._parser.parse_known_args(gdb_argstr.strip().split(' '), None) - if argv: - print('unrecognized arguments: %s'%(' '.join(argv))) - print(self._parser.format_usage()) - print(self._parser.format_help()) - return None - return args \ No newline at end of file + try: + args, argv = self._parser.parse_known_args(shlex.split(gdb_argstr), None) + if argv: + print('unrecognized arguments: %s'%(' '.join(argv))) + else: + return args + except SystemExit: + pass + return None + + def invoke(self, argument: str, from_tty: bool) -> None: + parsed = self._parse_args(argument) + if not parsed: + return + self.on_execute(parsed, argument, from_tty) + + def on_execute(self, parsed, gdb_args, from_tty): + raise NotImplementedError() \ No newline at end of file diff --git a/lunaix-os/scripts/gdb/lunadbg/mem.py b/lunaix-os/scripts/gdb/lunadbg/mem.py index 8829e1b..558ad3a 100644 --- a/lunaix-os/scripts/gdb/lunadbg/mem.py +++ b/lunaix-os/scripts/gdb/lunadbg/mem.py @@ -1,7 +1,7 @@ from .commands import LunadbgCommand from .pp import MyPrettyPrinter from .profiling.pmstat import PhysicalMemProfile -from .structs.pagetable import PageTable, PageTableEntry +from .structs.pagetable import PageTable class MMStats(LunadbgCommand): def __init__(self) -> None: @@ -27,16 +27,17 @@ class MMStats(LunadbgCommand): pmem.rescan_pmem(optn.granule) pp.printf("Total: %dKiB (%d@4K)", - pmem.max_mem_sz, pmem.max_mem_pg) + pmem.max_mem_sz / 1024, pmem.max_mem_pg) pp.printf("Used: %dKiB (%d@4K) ~%.2f%%", - pmem.consumed_pg * 4096, + pmem.consumed_pg * 4096 / 1024, pmem.consumed_pg, pmem.utilisation * 100) pp.printf("Fragmentations: %d ~%.2f%%", pmem.discontig, pmem.fragmentation * 100) pp.print() pp.print("Distribution") + pp.print("( . = empty, * = full, [0-9]0% full )") pp2 = pp.next_level(2) row = [] for i in range(0, len(pmem.mem_distr)): @@ -45,7 +46,7 @@ class MMStats(LunadbgCommand): if ratio == 0: row.append('.') elif ratio == 1: - row.append('F') + row.append('*') else: row.append(str(cat)) @@ -79,8 +80,7 @@ class MMStats(LunadbgCommand): else: print("unknow mem type:", optn.state_type) - def invoke(self, argument: str, from_tty: bool) -> None: - optn = self._parse_args(argument) + def on_execute(self, optn, gdb_args, from_tty) -> None: pp = MyPrettyPrinter() if optn.cmd == 'stats': diff --git a/lunaix-os/scripts/gdb/lunadbg/pte_utils.py b/lunaix-os/scripts/gdb/lunadbg/pte_utils.py new file mode 100644 index 0000000..051bb48 --- /dev/null +++ b/lunaix-os/scripts/gdb/lunadbg/pte_utils.py @@ -0,0 +1,98 @@ +from .commands import LunadbgCommand +from .structs.pagetable import PageTable, PageTableEntry +from .pp import MyPrettyPrinter +from gdb import parse_and_eval, lookup_type + +class PteInterpreter(LunadbgCommand): + def __init__(self) -> None: + super().__init__("pte") + + self._parser.description = "Interpret the PTE based on give raw value or ptep" + self._parser.add_argument("val") + self._parser.add_argument("--va", action='store_true', default=False, + help="treat the given as virtual address") + + self._parser.add_argument("--ptep", action='store_true', default=False, + help="treat the given as ptep") + + self._parser.add_argument('-l', "--at-level", type=int, default=-1, + help="translation level that the given virtual address located") + + self._parser.add_argument('-m', "--mnt", default=-1, + help="vms mount point that the given virtual address located") + + @staticmethod + def print_pte(pp, pte_val, level): + pte = PageTableEntry.from_pteval(pte_val, level) + pp.print(pte) + + @staticmethod + def print_ptep(pp, ptep, level): + pte = PageTableEntry(ptep, level) + pp.print(pte) + + def on_execute(self, parsed, gdb_args, from_tty): + pp = MyPrettyPrinter() + + val = int(parse_and_eval(parsed.val)) + lvl = parsed.at_level + if not parsed.va: + PteInterpreter.print_pte(pp, val, lvl) + return + + if not parsed.ptep: + ptep = PageTable.mkptep_at(parsed.mnt, val, lvl) + PteInterpreter.print_ptep(pp, ptep, lvl) + return + + PteInterpreter.print_ptep(pp, val, lvl) + +class PtepInterpreter(LunadbgCommand): + def __init__(self) -> None: + super().__init__("ptep") + + self._parser.description = "Manipulate the pte pointer" + self._parser.add_argument("ptep") + self._parser.add_argument("--pfn", action='store_true', default=False, + help="get the pfn (relative to mount point) implied by this ptep") + + self._parser.add_argument("--vfn", action='store_true', default=False, + help="get the vfn implied by this ptep") + + self._parser.add_argument("--level", action='store_true', default=False, + help="estimate the translation level implied by this ptep") + + self._parser.add_argument("--to-level", type=int, default=None, + help="convert given ptep to specified level before any other processing") + + self._parser.add_argument("--sn", action='store_true', default=False, + help="shift the ptep to next translation level") + + self._parser.add_argument("--sp", action='store_true', default=False, + help="shift the ptep to previous translation level") + + + def on_execute(self, parsed, gdb_args, from_tty): + pp = MyPrettyPrinter() + + ptep = int(parse_and_eval(parsed.ptep)) + if parsed.to_level is not None: + ptep = PageTable.get_lntep(ptep, parsed.to_level) + pp.printf("ptep: 0x%016x", ptep) + + if parsed.pfn: + ptep = PageTable.get_pfn(ptep) + pp.set_prefix("pfn: ") + elif parsed.vfn: + ptep = PageTable.get_vfn(ptep) + pp.set_prefix("vfn: ") + elif parsed.level: + l, m = PageTable.ptep_infer_level(ptep) + pp.printf("Level %d ptep (mnt=0x%016x, vfn=%d)", l, m, PageTable.get_vfn(ptep)) + return + elif parsed.sn: + ptep = PageTable.shift_ptep_nextlevel(ptep) + elif parsed.sp: + ptep = PageTable.shift_ptep_prevlevel(ptep) + + pp.printf("0x%016x", ptep) diff --git a/lunaix-os/scripts/gdb/lunadbg/sched_dump.py b/lunaix-os/scripts/gdb/lunadbg/sched_dump.py index 9621f02..4dce934 100644 --- a/lunaix-os/scripts/gdb/lunadbg/sched_dump.py +++ b/lunaix-os/scripts/gdb/lunadbg/sched_dump.py @@ -10,9 +10,9 @@ class ProcessDump(LunadbgCommand): def __init__(self) -> None: super().__init__("proc") - def invoke(self, argument: str, from_tty: bool) -> None: + def execute(self, parsed, gdb_args, from_tty): pp = MyPrettyPrinter() - ProcInfo.process_at(argument).print_detailed(pp) + ProcInfo.process_at(gdb_args).print_detailed(pp) class SchedulerDump(LunadbgCommand): @@ -23,11 +23,7 @@ class SchedulerDump(LunadbgCommand): self._parser.add_argument("-l", "--long-list", required=False, default=False, action='store_true') - def invoke(self, argument: str, from_tty: bool) -> None: - args = self._parse_args(argument) - if args is None: - return - + def on_execute(self, args, gdb_args, from_tty): sched_context = gdb.parse_and_eval("&sched_ctx") sched = Scheduler(sched_context) diff --git a/lunaix-os/scripts/gdb/lunadbg/structs/pagetable.py b/lunaix-os/scripts/gdb/lunadbg/structs/pagetable.py index 1ffc062..58ed0c8 100644 --- a/lunaix-os/scripts/gdb/lunadbg/structs/pagetable.py +++ b/lunaix-os/scripts/gdb/lunadbg/structs/pagetable.py @@ -3,22 +3,33 @@ from . import KernelStruct from ..arch import PageTableHelper as TLB class PageTableEntry(KernelStruct): - def __init__(self, gdb_inferior: Value, level, va) -> None: + def __init__(self, ptep, level, pte=None) -> None: self.level = level - self.pg_mask = self.get_page_mask() - self.va = va & ~self.pg_mask self.base_page_order = TLB.translation_shift_bits(-1) + self.ptep = ptep - ptep = gdb_inferior[va // (self.pg_mask + 1)].address - super().__init__(ptep, PageTableEntry) - - try: - self.pte = int(self._kstruct.dereference()) - except: - self.pte = 0 + super().__init__(Value(ptep), PageTableEntry) + + if pte: + self.pte = pte + self.va = None + else: + self.va = PageTable.va_at(ptep, level) + try: + self.pte = int(self._kstruct['val']) + except: + self.pte = 0 self.pa = TLB.physical_pfn(self.pte) << self.base_page_order + self.page_order = TLB.translation_shift_bits(self.level) + self.page_size = 1 << self.page_order + self.page_order -= self.base_page_order + + @staticmethod + def from_pteval(pte_val, level): + return PageTableEntry(0, level, pte=pte_val) + def print_abstract(self, pp, *args): self.print_detailed(pp, *args) @@ -30,24 +41,29 @@ class PageTableEntry(KernelStruct): pp.print("") return - page_order = TLB.translation_shift_bits(self.level) - page_order -= self.base_page_order - pp.printf("Level %d Translation", TLB.translation_level(self.level)) pp2 = pp.next_level() - pp2.printf("Entry value: 0x%x", self.pte) - pp2.printf("Virtual address: 0x%x (ptep=0x%x)", self.va, int(self._kstruct)) - pp2.printf("Mapped physical: 0x%x (order %d page)", self.pa, page_order) + pp2.printf("PTE raw value: 0x%016x", self.pte) + + if not self.va: + pp2.printf("Virtual address: (ptep=)") + else: + pp2.printf("Virtual address: 0x%016x (ptep=0x%016x)", self.va, int(self._kstruct)) + + pp2.printf("Mapped physical: 0x%016x (order %d page)", self.pa, self.page_order) pp2.printf("Page Protection: %s", self.get_page_prot()) pp2.printf("Present: %s", self.present()) - pp2.printf("Huge: %s", TLB.huge_page(self.pte)) + pp2.printf("Huge: %s", TLB.huge_page(self.pte, self.page_order)) pp2.print("Attributes:") pp2.next_level().print(self.get_attributes()) + + def leaf(self): + return TLB.huge_page(self.pte, self.page_order) or not self.page_order @staticmethod def get_type() -> Type: - return lookup_type("unsigned int").pointer() + return lookup_type("pte_t").pointer() def get_page_mask(self): return PageTableEntry.get_level_shift(self.level) - 1 @@ -60,7 +76,8 @@ class PageTableEntry(KernelStruct): def get_attributes(self): attrs = [ self.get_page_prot(), - *TLB.other_attributes(self.level, self.pte) ] + *TLB.other_attributes(self.level, self.pte), + "leaf" if self.leaf() else "root" ] return ', '.join(attrs) def null(self): @@ -76,22 +93,108 @@ class PageTableEntry(KernelStruct): @staticmethod def max_page_count(): return 1 << (TLB.vaddr_width() - TLB.translation_shift_bits(-1)) + + def pfn(self): + return (self.ptep & (((1 << TLB.translation_shift_bits(0)) - 1))) // TLB.pte_size() + + def vfn(self): + return (self.ptep & (((1 << TLB.translation_shift_bits(-1)) - 1))) // TLB.pte_size() class PageTable(): def __init__(self) -> None: - self.levels = [ - Value(0xFFFFF000).cast(PageTableEntry.get_type()), - Value(0xFFC00000).cast(PageTableEntry.get_type()) - ] + pass - def get_pte(self, va, level=-1) -> PageTableEntry: - return PageTableEntry(self.levels[level], level, va) + @staticmethod + def get_pfn(ptep): + pfn_mask = ((1 << TLB.translation_shift_bits(0)) - 1) + return ((ptep & pfn_mask) // TLB.pte_size()) + + @staticmethod + def get_vfn(ptep): + vfn_mask = ((1 << TLB.translation_shift_bits(-1)) - 1) + return ((ptep & vfn_mask) // TLB.pte_size()) + + @staticmethod + def mkptep_for(mnt, va): + mnt_mask = ~((1 << TLB.translation_shift_bits(0)) - 1) + offset = (TLB.physical_pfn(va) * TLB.pte_size()) & ~mnt_mask + + return (mnt & mnt_mask) | offset + + @staticmethod + def ptep_infer_level(ptep): + l = 0 + pfn = PageTable.get_pfn(ptep) + pfn = pfn << TLB.translation_shift_bits(-1) + vfn = (TLB.pgtable_len() - 1) + msk = vfn << TLB.translation_shift_bits(l) + max_l = TLB.translation_level() + + mnt = ptep & msk + + while (pfn & msk) == msk: + l+=1 + msk = vfn << TLB.translation_shift_bits(l) + if l == max_l: + break + + return (max_l - l, mnt) + + @staticmethod + def va_at(ptep, level): + vms_mask = ((1 << TLB.vaddr_width()) - 1) + + ptep = PageTable.get_pfn(ptep) << TLB.translation_shift_bits(level) + return ptep & vms_mask + + @staticmethod + def get_l0tep(ptep): + return PageTable.get_lntep(ptep, 0) + + @staticmethod + def get_lntep(ptep, level): + lnmask = (1 << TLB.translation_shift_bits(level)) - 1 + size = (1 << TLB.translation_shift_bits(-1)) + vpfn = (lnmask * size) & lnmask + offset = ((ptep // TLB.pte_size()) * size // (lnmask + 1)) & (size - 1) + + return (ptep & ~lnmask) | vpfn | (offset * TLB.pte_size()) + + @staticmethod + def mkptep_at(mnt, va, level): + lfmask = (1 << TLB.translation_shift_bits(-1)) - 1 + lsize = (1 << TLB.translation_shift_bits(level)) + offset = (va // lsize) * TLB.pte_size() + + return mnt | ((lsize - 1) & ~lfmask) | offset + + @staticmethod + def shift_ptep_nextlevel(ptep): + mnt_mask = ~((1 << TLB.translation_shift_bits(0)) - 1) + size = (1 << TLB.translation_shift_bits(-1)) + mnt = ptep & mnt_mask + vpfn = ((ptep // TLB.pte_size()) * size) & ~mnt_mask + + return mnt | vpfn + + @staticmethod + def shift_ptep_prevlevel(ptep): + mnt_mask = ~((1 << TLB.translation_shift_bits(0)) - 1) + self_mnt = (TLB.pgtable_len() - 1) * (~mnt_mask + 1) + unshifted = PageTable.get_pfn(ptep) << TLB.translation_shift_bits(-1) + unshifted = PageTable.mkptep_for(self_mnt, unshifted) + return PageTable.mkptep_for(ptep & mnt_mask, unshifted) def __print_pte_ranged(self, pp, pte_head, pte_tail): start_va = pte_head.va - end_va = pte_tail.va + + if pte_head == pte_tail: + end_va = pte_head.va + pte_head.page_size + else: + end_va = pte_tail.va + sz = end_va - start_va - if not (pte_head.null() and pte_tail.null()): + if not pte_head.null(): pp.printf("0x%016x...0x%016x, 0x%016x [0x%08x] %s", start_va, end_va - 1, pte_head.pa, sz, pte_head.get_attributes()) @@ -99,25 +202,64 @@ class PageTable(): pp.printfa("0x{:016x}...0x{:016x}, {:^18s} [0x{:08x}] ", start_va, end_va - 1, "n/a", sz) - def print_ptes_between(self, pp, va, va_end, level=-1): - shift = PageTableEntry.get_level_shift(level) - n = (va_end - va) // shift - self.print_ptes(pp, va, n, level) - - def print_ptes(self, pp, va, pte_num, level=-1): - head_pte = PageTableEntry(self.levels[level], level, va) - curr_pte = head_pte - va = head_pte.va + def __scan_pagetable(self, pp, start_ptep, end_ptep, max_level = -1): + ptep = PageTable.get_l0tep(start_ptep) + level = 0 + max_level = TLB.translation_level(max_level) + va_end = PageTable.va_at(end_ptep, -1) + 1 + head_pte = None + prev_pte = None pp.printfa("{:^18s} {:^18s} {:^18s} {:^10s} {:^20s}", "va-start", "va-end", "physical", "size", "attributes") - for i in range(1, pte_num): - va_ = va + i * PageTableEntry.get_level_shift(level) - curr_pte = PageTableEntry(self.levels[level], level, va_) + while PageTable.va_at(ptep, level) <= va_end: + pte = PageTableEntry(ptep, level) + if head_pte == None: + head_pte = pte + prev_pte = pte + + if pte.null(): + if not head_pte.null(): + self.__print_pte_ranged(pp, head_pte, prev_pte) + head_pte = pte + elif not pte.leaf() and level < max_level: + ptep = PageTable.shift_ptep_nextlevel(ptep) + level+=1 + continue + else: + if head_pte.null(): + self.__print_pte_ranged(pp, head_pte, prev_pte) + head_pte = pte + else: + n = pte.pfn() - head_pte.pfn() + pa = head_pte.pa + (n << pte.base_page_order) + if pa != pte.pa or not pte.same_kind_to(head_pte): + self.__print_pte_ranged(pp, head_pte, prev_pte) + head_pte = pte + + prev_pte = pte + if pte.vfn() == TLB.pgtable_len() - 1: + if level != 0: + ptep = PageTable.shift_ptep_prevlevel(ptep + TLB.pte_size()) + level-=1 + continue + break - if not curr_pte.same_kind_to(head_pte): - self.__print_pte_ranged(pp, head_pte, curr_pte) - head_pte = curr_pte + ptep += TLB.pte_size() + - if curr_pte != head_pte: - self.__print_pte_ranged(pp, head_pte, curr_pte) \ No newline at end of file + self.__print_pte_ranged(pp, head_pte, prev_pte) + + def print_ptes_between(self, pp, va, va_end, level=-1, mnt=0xFFC00000): + ptep_start = PageTable.mkptep_for(mnt, va) + ptep_end = PageTable.mkptep_for(mnt, va_end) + self.__scan_pagetable(pp, ptep_start, ptep_end, level) + + def get_pte(self, va, level=-1, mnt=0xFFC00000) -> PageTableEntry: + ptep = PageTable.mkptep_at(mnt, va, level) + return PageTableEntry(ptep, level) + + def print_ptes(self, pp, va, pte_num, level=-1, mnt=0xFFC00000): + ptep_start = PageTable.mkptep_for(mnt, va) + ptep_end = ptep_start + pte_num * TLB.pte_size() + self.__scan_pagetable(pp, ptep_start, ptep_end, level) \ No newline at end of file diff --git a/lunaix-os/scripts/gdb/lunadbg/syslog.py b/lunaix-os/scripts/gdb/lunadbg/syslog.py index e8a56c4..b7948d4 100644 --- a/lunaix-os/scripts/gdb/lunadbg/syslog.py +++ b/lunaix-os/scripts/gdb/lunadbg/syslog.py @@ -21,4 +21,4 @@ class SysLogDump(gdb.Command): head = log_recs.deref_and_access("kp_ents.ents").address ent_type = gdb.lookup_type("struct kp_entry").pointer() - llist_foreach(head, ent_type, "ents", lambda a,b: self.syslog_entry_callback(a, b)) \ No newline at end of file + llist_foreach(head, ent_type, "ents", lambda a,b: self.syslog_entry_callback(a, b), inclusive=False) \ No newline at end of file diff --git a/lunaix-os/scripts/templates/i386/config.json b/lunaix-os/scripts/templates/i386/config.json index 911bb0e..4b2a186 100644 --- a/lunaix-os/scripts/templates/i386/config.json +++ b/lunaix-os/scripts/templates/i386/config.json @@ -72,18 +72,11 @@ "stk_align": 16 }, { - "name": "kernel_exec", + "name": "kernel_img", "start": "3@1G", "size": "16@4M", "block": "1@page" }, - { - "$type": "list", - "$range": "[1..*vms_mnts]", - "name": "vms_mount_{index}", - "size": "1@4M", - "block": "1@huge" - }, { "$type": "list", "$range": "[1..*page_mnts]", @@ -94,6 +87,13 @@ "name": "vmap", "block": "1@huge" }, + { + "$type": "list", + "$range": "[1..*vms_mnts]", + "name": "vms_mount_{index}", + "size": "1@4M", + "block": "1@huge" + }, { "name": "pd_ref", "start": "1023@4M", -- 2.27.0