From 90255207d6ca54f8a7b955d2af1c1ec16d0af128 Mon Sep 17 00:00:00 2001 From: 170010018 <170010018@iitdh.ac.in> Date: Sat, 7 Mar 2020 18:46:27 +0530 Subject: [PATCH] Quantum printing working --- drivers/storage/memory/imgrd.o | Bin 3695030 -> 3695030 bytes drivers/storage/memory/memory | Bin 3757406 -> 3757406 bytes drivers/storage/ramdisk/image | Bin 3694592 -> 3694592 bytes "kernel\r" | 681 +++++++++++++++++++++++++++++++++ kernel/kernel | Bin 234963 -> 234995 bytes kernel/system.c | 3 + kernel/system.o | Bin 9796 -> 9936 bytes servers/sched/schedule.c | 4 +- 8 files changed, 687 insertions(+), 1 deletion(-) create mode 100755 "kernel\r" diff --git a/drivers/storage/memory/imgrd.o b/drivers/storage/memory/imgrd.o index 3906f33d3801b29c664fc1fcce96ff6f056fcd5f..b7d4f39f3c28dfcf3453e46234e39153011dbdc4 100644 GIT binary patch delta 14543 zcmaLe=~EMD9Ki8h93dc=N`ffhL2PX++ESV6o5Z7U{2z3jzNjzSshw$O?2LATfGF{T zDDgr;@xJg1-bV32g9_d#-WMKt-)Dc>h?8BKZ}JE8&91Nhn%*bXIvfcN zmA{PYD89^Tx3)VCy5PelPaP0^_KtB3>2GZ>(1*0qpjKC@Im6TDuv)_Acr4Dm_^|OP z?>M(CHP&fWznbfa&hV_%yjtOu7u%eg6%Nf)y}?M$*gZ5)wMY5hjXy=((>k_#LW^pj zJeFaa)oI3V%{ZVLTZU`qYsPNPIG`C@Mrh`1#_kd7-5KZ|lRMaM>o`PyITYa^Z?3{$ z_IAAb7f4};3aTqhuM7SKAK`~f7ai1c(T+#BCMs(Vy>H0Fbt0vH#2Wx-pcG_u4CTDyq$Rm^G@bn%)6QQFz;pV%G`~)J98SdmD$g{k9j|H zJ@WzPgUpAR4>LC~A7MVq9AIu_KE`~U`2@3#Ii0x&a|Uxy<|gK5=9A2)m`^jGVLr=z zj`=)u3-bl$i_ERemzXazUt#XWoXMQUoXy;u`6}}@=IhKim~S%QV!q9Mhq;aUF7rL+ z`^*oR+nFCSKVt5~+?Tl@a}Kke`7!eo=BLchn4dGhV1CK`iupD38|Jsn@0i~+e_;N| z{7K>TNGA?;vC27E<#c-IvyOUH1F8|#gz7>qK%InIh+2eNj5-;$1a%7PRMb*bH|jLh z>8LYMXQD=-Mx(}{#-f^0XQ7s%mZN%5XQR$Rtw8mn&PAPvIv;fb>O#~?)J3R^QR7f8 zsPU)?s9jL2P^(dwpe{wNL0yKr9CZciO4L=Tt5MgWu0>skx*l}{Y9eY9YBFjHYAR|i z>PFN}sGCu@pl(I=q1K^pL*0(L19d0rF4WzqdrOs^)sE1J-P>-Mv%j(P&shMJDr12qG+Cu$RFGwMmyQ>dp=&!C<~J%@T8 zwFUJ8>P6I6)Jv$BQLmu(Ld`_YLd{0)jd~UJ8tQe_8>lx?Z=v2sy@T3@dKdK`>V4D) zsO_i^Q6Hi9LG6p$4>bqXj`|q&3F=eSXQgX8f!o`DjK?Q zw)5O1)MV5Y)KpZLIe5}G(pLFV3sCo=PD0&}T8LVYT7-H4wHWmv>SWYIs3oX}QKz6b zpiV_Sf?A4t6xEFyK%Iu#h&mnh80rkvchuVTVAN2z20@RDB3sGB9D^V|@E<(MGx)}9JP`}(hrM<)L z*U(R{zgO#Z2DxJ4l+<>9}+4zF9SWRFRrnHQQQTCpU`SiSZ_lHku0a{U!N+y=0J#l1Yk^qNNxqRx(R* zl0}M_5~MCtqLd^hODR&S)K%&xb(hj4t7MbXr5;j-)KlsuWlC96w$xkdBlVT~NjZ{T n>MwmIeJu@;zLCC_zLN$@xzZqMu=Kt3gOn%zSeNe~@^AHjMIWc! delta 14543 zcmaLe=~EMD9Ki8h1VVybDhZ;12iV$Hw52lBH;G5zIMY8t$5-`5JGC?IjGfU=5D+C^ z5GCG%;(g&oyp7@=RPaXezVN{NKKsi?ob1wk!+a<6FcCgr!&ES z^_LOt*~(qH_BNM67kaqmsU1SkzERFWeeG?9`mi<_)aov?WO!Shc5B2Ouho@rix`ja zjq%7*qg{6Ot9edyhIfVL)k>GV*y_@(aB#lr4TfvRp27L5Ju2{R_{p4`*1px_npOMc zwGPp&PBZps#zD>4I#e@XGxli4LCx4YOfz3I_6$?+PJiF1yn(rn_CpkqLlOD$<|+JT zZ^x>Sk$3pd>a~shy!ht>9{5AGHg8a~xX#y9n~>|M$_{-4;*@VehWc@}devyXW;^Bm^6%=4J%GcRCX$h?R- zp4rN5V@_c1#9YN(&Aga-33CneQs!mM%b8a&uVh}uyqb9p^IGP0%CD}jGnl(GH!?RdpJYD8e46* zXMVuk#{7`^5pyr*-pqZNbC`3PA2UB;e#-oe`8o3o=9kQ`m|ru$VSdZ}j`=!?RHpc+w4sBY9k)Cs6XsKuxys1s33Q755JMlD12piV)Z ziaHH-I%*8688sF)4%LD>1GOBr0@aH;6Ll79C8`f~HtHPIxv29{=c6t_U5L5}H6GQ9 zYC}yx?Sxu|T8+9GbqQ(>>QdBYsLN4Tpsqw+g}NGb4eDCdb*Sr66H${;lTlMpQ&DSC zH=u4r-GsUsbqi`8svmVL>NeEvs5?-1qV7W7jk*W5Gin#quBd6KcGLjsUetZ4^{D$% z51<}IJ%oA~^$6-w)F5gD>M_*gs3%YzsOhNPP%}`wqc);8p`JuNg?bwG4C-0bbExN0 zn^7;IUPNs{y@Yxh^$Kba)J)VY)NItAs8><1p)ZVClP;*doQ6Hl|L4At)4D~tc3)GjWuTWp3zCnG9`VRFy>Ic-1sGmY= zuZwaKW8Z)U&8Q)N`n_QO~2!L2X8zi+TZd9_mHZ`KT?Z3s5hiE=0YIx(M}3NWa`ZrM<)L z*YHoSzgO#Z2DxL#CO@1;-t{tC;k25<@GUd1`l;9(tW)1z^_zNeU6p$A;ePe4Umm}D zdQo^|+V5PuZ&6JjQLN?`&9;{KDWO5aOANcqx_{(``uf2;okflo_f diff --git a/drivers/storage/memory/memory b/drivers/storage/memory/memory index b41b9082c0a2b6aa07cb65c7f1028f52d8dbde2a..2c4ef0e797d07c7ce1a2aec79ea2fee961633e51 100755 GIT binary patch delta 11693 zcmaLd*Hcty7=ZCTyUQ+R>7szUv{f(_Q;1%Ya>-2c2P7sFCu7=0GLwvECeADZVp-7@ z~3A*ilzSMa6~%d+)vE-90#XKIX~AGYr4;o{wG5vcsPF+7?{Y+9Y3<)*9PX zJ8;08T$R}kdAdu}TqceUbCIy?&1C4S{==XQx9-!lR5Le!9qrZ|yKpee?yk0~!&y0Y zw_ezV?}XSV9P`#s)a$HTfeG4G@Y=Kj(_`*`j+iz1bIo8f+S9ec+*>U;#uJHVabk>F9_(cm%QuCS;3 zvNemvVwWtIw_dRWEOz~*SBAUdl~C3$ftP@nf|r30 z2QLR70X`CZ6!>UxKlm8%3h=Su5#SDRCwL@y6!I`~BJN#K*g zr-0Xh*Md(4p9UTc9s}+Ij|GndpAJ3)d?t7u_$=_*;B&y|g3kk=5553=A^0Nj#o$Z8 zmx9NGCx9n{CxIt}F9Tl=z5;wD_$u(#;A_C^!PkPX178om0lWcxBlsrp&EVa@Q^31} z_W(}?Zv@{0z7>2M_;&Ce;5)&0fj5Eg2Hyj|7d!~Q4}3rP0r0d=H-A9!1@imoUH;wc z**R|d(BcO7fH#951V03R7`z4i2>4O(W8kge$H7m4p9DVzej2uBCG58bkr{K@PpM$>ue+m8y{B@_BZ+k?BZ&!rg&rPm@TfuGMc5okfG59d> z67W*+GVtNx<=`X0M}m(69}VsY9|K+iJ{CLz+yU+cj|7hb9|s-)9}iv$UIjh@yc%2w zp9nq)d@}eH@EY)1@TuU_z@x!qz+K?6;Bny7!DoQa1g`_11wI>m4)|Q~dEoQG7l1DW zUj)7wd$=@MQ31;LE{RfUg8!1-=@54R}5HTJUw?>%ljGH-K*h-vquH zyc>85cz5s~;Hlt^;9J1Af^P%g4!#3?C-^S#Ch*jXl{|Wv# z_&?x7!;X7AG-HnkZ2__V|6!Z4btCwba?c|HJP|wzJh{_N7saP*-+5#MkNjMdH-Z;~ zZvh_$z7@O#d>eQv_;&Cz@Ezd8!FPg}gYN<#0p0{Y5_~uKDDXYtqrvxr`@w_YW5D-; zSAg#a9}9i}d>nW)cmVt$_;~O`;FaKq!K=Vqz$bto0j~x>3a*161D^=q3O)(^IQV4n z6W~+8PlDHgp8~H1KMg(=ybXLB_!+~yZ0a41D|?B&fqO|nWh zDfE4W7szUv{f(_Q;1%ga>}^$4RBTwV_ufn1-GhVYW1d_*!|*%r`Pk(wJM5XSweF(UD)}n4me~5U z{Rh0sRgvA0r@J)GW#ZT{7Ye)HOoqPdKMcxn>po3OHFML~(Qdu569=>G?kcM~oRwpD z>-{?Moe=wkW8V6SdaYF}FhQFNUYk~6dhC7m86JC{?zd?!)0wq0Xo5Bsymn<`pbE7r zw5i~YP}fkQR)sbdybk3ltBha*CV^}-m<6=yol5q7`o@!{q4LYFc>6x`C! zSYMs*2d;sC4sHei0^A1vCAb~@E5lv!%B##`ys|sF25tqnf!o1-;6>oWz>C34z)Qi0 zgO`Di03QiH3VbxUAAAgWIrv!c2yh3u6Fd?;3Va-R0DL@n1$ZU+1n??w9eg7AB=E`L zQ^2Q!PXnJ0UJV`%9s}+Ij|GnduK}L{J`=nad=~g@@Hyaf!RLX`2d@KP0KO1>5%^;8 zCE)Sk3E+v~N#M!gOTm|cF9%-%z7l*D_-gQa@HOCT!PkMW2X6r10KO4?6L=T!6!5O# z-M~}98^Je&Zvo#5z72dk_zv)$;Jd(ggYN;~3mydD2fiQt0C-x5n?IoV0{Ol4PXF$8 z?-)0IXmNvkz?;Aif*%4u4BiZW1pFxYG4K}f)1b+nn82kzNQ}Act&%s}SzXX2;{<_1>w>=`mw<|*L=O)*{t>89rJGc+L2z(fL zF?b1hDfn>kGVl@LBf&?3j|TUHj{z?S9}6AIuY z7lJPWUkttkJRUp&JP|wzJQ;i`_%iV2;48pag0BK!4PFnv27E2}I`H-24d5HVH-c{h z?*g6z-W9wXcq(`!_-61e;9J4Bfo})j0lpJ_7x-@QJ>Yx6gW&tX_k$k*PXkW}?+)$; z_kcHn9|S)Hei*zN{0R6_@MGXD;K#vFfS&|E1%4X575of%26!fT7I-#z4)|H{bKvK} z+rTe?Uj)Adei{4<_*L+0;Mc)#fZqha1%4ac3*G~~CwMM+9{3&byWsc0?}I-8e+d2v z{4w|w@TcI8F?e}exF z{tx)ju;U&N&Di5XTR^P;f7oVh-3b1q-1A5PPXtc_PwsHjMe*s{cOKcmBR|*Vjo?M# zo56>HZvig`-wIv=z74z-d^`AX@Ezb~;5)%bfbRky3BDVA6!;$S(cpW*{oq0HG2r{a z%fa`9j|D#fJ`TJIJOF+Wd_4Fe@Cxw5;FaLb;1j@)fLDPZ1=qokflmZ)0iOhZ9DFkP z3GgZ4C&8zJp8}r-ej0o_cq@1{_!+}HZR#D=eh+@I^8Wv`;f3NUZ*NKb#b&YmD*YBZ zo~irQ^L{tZ3yPa}pAJ^Gz1D|>}5?pO|nWh zDfE4WB`a4aV&?*ps^_9$IICjP_uXrr z!ID5hG#n0kFe{Fca4=XiEB-r{-6JV4x-6XQ)n0|EdC~hm9n-UFYRAsLsUwGGmaUA>plK02+ec}aG9)Vg~AA|2j@(r(@h40ZD^(4%I7h;L%7 zTc_G@y}{iR0wsa`(l3J^3=k&9F&gnrO{!M&X>#=fUwKze!KtaJX{hO_8K|{TGf{)D zb*A_ACM3VU;MDpF)eq0xmQvLkM_L3D;y>|+r>4e_w6DGE)p@<%H(u?7nh>r&w{LD3 zHGtX~H4(KCH3_u~YBK5<)f)cR`x#EC`E2?_K!rpVl2k}mA)-QG75b^rUxgwS2B_dv z7^p(A3WHP_tili#hN>`3h2biUP$5NyR29-xNLL|4g^?Yju0oj#G69gRW}(t8bD1%O+rmZjiB~L?T6YQwFq?pszV)!T8ugfbuj7>)S;-u zP=}+AKutkSMNLCZN6kPTiCThMiW)^7g*qB_3~CH@Eb2Ja@u(9}C!$V5os2pKwH9h7 zY7jLGwKnQh)M=>GQD>meM4g2?8}$#=IjD0{|3v)@bsp+`)CH&uQR|>)qvoL2MXiUr z2z4>)64a%r%TSl2mZ6rTu0UOhx(anQ>KfFwsOwPIqt-`lfZ7l>gqn+Ls2fl>qHaRn zjJgGNE9y4X3e@eWJ5YC`?n2#-x(9VHY9rLfs7+AwP@AIeL*0*h0QDg1A=JaDM^GzK zkD?w!J&t+;^(5*k)YGVEP@ADPM{R-H615fTS=4i==TR@9UPQfwdKvW!>Q&ThsMk^d zM*Ro%2I@`JTd1v3+n}~Z%||Ujy^VSY^)Bi?)cdFpP#>Z`LVb+-1obKEGt}p(FHm2i zzN%K6=HD1ooY5{?rJfxrfj2u+eB6tzrB8}36V1IhQnBycf;XNZzh(Od*_A9eLEe?y~p*hIf0dX&s zaB@XjKXVpvmgp?WS+cVfXQ|H8oTWRku}H0kiks zGhy>*?>)lad+$9O2U2lwzduJ-bUxp6&-HaIS-Cn9yAX(!KNknXS*7PYcd2{^ivs!4 za5(6}tT;x(!C>XA`0rSD*QC7Y@^G$KyBDP9MIZZgRJZb}ZQA*!4j-J67wzHKZbQm- zdAr=qk4_dXYuDB@4i$LEzZA6fyyEX;IfWVdQ7Z^~4lDB=7HaQX#y5`n#$~>7sDtl# z-#F$Qm-)t_j=tkNdM~3@bV^CXqU`jjb@cv4T7L+|oxB$q>f~LZYvlqF-^5s_wpBlR zgS#XIiUKW)e+YUoK$sZEXv8-)sY1=C$rTIy=v_4hr>3H&p{Ao|pjJW6L=C>z>E73y zko^9FQ)?zvJUnk(N_ndrX%t9^|HL1jni@aSe)6tY?frT`d$lKOLb&4GzPVx40BSqb zMAQP*B-Hk($*3JFG~C(y8BVDDZ2Ch$g+vvSR7h4KqCzhfdaKY!g}y5EQ^BdwUxh*y z2B?+FhhlzD$G)0whD7pn5)7( z73Qn3K!t@WEK;GG3fU^;s8C&n8Y(PSVTlS$RamCNaursnP@+Pq3M*AurNU|z)~K*n zg>@>dS7Cz+HC3pkLTwd7D&(qQDr{6?lM0(v*rLK#6}G9cU4{MZw3cFR#qrzDg z&Z*Eqg@!6LQlYU5O;k9q!UYvBs&Gk#%PL$^;i?MPRJg9f4Ha&xa7%^TD%?@wt_t^5 zXsSXp6`HHiLWO)4?yK-Xg@-CUQsJ=*PgHoS!ZQ_~tMEdFmnytc;k62HRCuexyN`nB zE>=Q%{2ogAO$Lt!P!my;P?J$3sJ&2oqxM1Vi`oy>q4q~DL>+)S5OomhVALU~Ls5sJ zrl6*xrlF>zW}ps7EkZ3ujiQb~9f>*$HHJDGbqwlQ)N!ceQ752IM4g0M1vL{jh?<33 z6?HP|6x6Ax(@>|Q&On`sItz6+>KxR$sPj18frFb4r+DO8mNm=m!K|1 zU52_Gbp>h(YANbU)K#dfQP-fZMO}xw9(4n1P1IVbwNXQ;xu}M^5p@&lX4EaHTT!>6 zZb#jLx)XI5>Tc9MsC!ZOq3%bmgIX809%>$HebfV}2T>299!5QadKC2-Y8mQr)Dx&D zQBR?sMm>Xi7WEuz1Js77jZhn-HbFg)dI9w!>Lt|6s8>+0qFzJ2j(P+2Ch9HJ+o*R? z@1ovAZHn3qwK-}F)O^(Ys1HydqCP@>jQRxiDe5!S=cq4GU!uN3eU17C^)2eV3biTz zjWLB8Eu-b?*^v_Xup`CC-I;qZ|Hb?d^B>HAGXKro^8@=fMFc9gE0|9cQIq0YJj46{ zcQ#=TVRgb9gpmw5krDPH+(_7)a1&u4!p($z3AYgTBiu^p2)7aTC)`e0NVtP=0O3x; zfrPsV2NCWj989=}a0uaE!l8uw2!|2wCmc?AfUt=0AYn1#A;Ku(VZsrFM+ip}9wi(_ zc#JScSVlOS@HpWZ!V`pJ2~QG^BRoYop71o`1i~|f6A8}}P9i)P$Nz2g{Pn+ks3qQS zuiq*|q{O@7FjnH-aQOR&iN&Sfd7)C@PRCO3aeXRJV5QzO_pMxTrPuq#y>xLnc}H4r za~5!x=q$-uva=Ltsm{`zr8~=TR>fJSv!JsqXH}h5bC&Ha$60k}HJsISR?As!XCY^~ z&gwX;>#Ux$JZJTtHE`C@StDnSoi%aR)LAoU&7HMymhY^kvrn9T>g+RTpF8`)*_X~* ZIcx3gD`#Ij`^H%tXKkH*JJY_K{4bBYIza#c diff --git "a/kernel\r" "b/kernel\r" new file mode 100755 index 0000000..02e33fe --- /dev/null +++ "b/kernel\r" @@ -0,0 +1,681 @@ +/* This task handles the interface between the kernel and user-level servers. + * System services can be accessed by doing a system call. System calls are + * transformed into request messages, which are handled by this task. By + * convention, a sys_call() is transformed in a SYS_CALL request message that + * is handled in a function named do_call(). + * + * A private call vector is used to map all system calls to the functions that + * handle them. The actual handler functions are contained in separate files + * to keep this file clean. The call vector is used in the system task's main + * loop to handle all incoming requests. + * + * In addition to the main sys_task() entry point, which starts the main loop, + * there are several other minor entry points: + * get_priv: assign privilege structure to user or system process + * set_sendto_bit: allow a process to send messages to a new target + * unset_sendto_bit: disallow a process from sending messages to a target + * fill_sendto_mask: fill the target mask of a given process + * send_sig: send a signal directly to a system process + * cause_sig: take action to cause a signal to occur via a signal mgr + * sig_delay_done: tell PM that a process is not sending + * send_diag_sig: send a diagnostics signal to interested processes + * get_randomness: accumulate randomness in a buffer + * clear_endpoint: remove a process' ability to send and receive messages + * sched_proc: schedule a process + * + * Changes: +* Nov 22, 2009 get_priv supports static priv ids (Cristiano Giuffrida) + * Aug 04, 2005 check if system call is allowed (Jorrit N. Herder) + * Jul 20, 2005 send signal to services with message (Jorrit N. Herder) + * Jan 15, 2005 new, generalized virtual copy function (Jorrit N. Herder) + * Oct 10, 2004 dispatch system calls from call vector (Jorrit N. Herder) + * Sep 30, 2004 source code documentation updated (Jorrit N. Herder) + */ + +#include "kernel/kernel.h" +#include "kernel/system.h" +#include "kernel/vm.h" +#include "kernel/clock.h" +#include +#include +#include +#include +#include +#include + +/* Declaration of the call vector that defines the mapping of system calls + * to handler functions. The vector is initialized in sys_init() with map(), + * which makes sure the system call numbers are ok. No space is allocated, + * because the dummy is declared extern. If an illegal call is given, the + * array size will be negative and this won't compile. + */ +static int (*call_vec[NR_SYS_CALLS])(struct proc * caller, message *m_ptr); + +#define map(call_nr, handler) \ + { int call_index = call_nr-KERNEL_CALL; \ + assert(call_index >= 0 && call_index < NR_SYS_CALLS); \ + call_vec[call_index] = (handler) ; } + +static void kernel_call_finish(struct proc * caller, message *msg, int result) +{ + if(result == VMSUSPEND) { + /* Special case: message has to be saved for handling + * until VM tells us it's allowed. VM has been notified + * and we must wait for its reply to restart the call. + */ + assert(RTS_ISSET(caller, RTS_VMREQUEST)); + assert(caller->p_vmrequest.type == VMSTYPE_KERNELCALL); + caller->p_vmrequest.saved.reqmsg = *msg; + caller->p_misc_flags |= MF_KCALL_RESUME; + } else { + /* + * call is finished, we could have been suspended because of VM, + * remove the request message + */ + caller->p_vmrequest.saved.reqmsg.m_source = NONE; + if (result != EDONTREPLY) { + /* copy the result as a message to the original user buffer */ + msg->m_source = SYSTEM; + msg->m_type = result; /* report status of call */ +#if DEBUG_IPC_HOOK + hook_ipc_msgkresult(msg, caller); +#endif + if (copy_msg_to_user(msg, (message *)caller->p_delivermsg_vir)) { + printf("WARNING wrong user pointer 0x%08x from " + "process %s / %d\n", + caller->p_delivermsg_vir, + caller->p_name, + caller->p_endpoint); + cause_sig(proc_nr(caller), SIGSEGV); + } + } + } +} + +static int kernel_call_dispatch(struct proc * caller, message *msg) +{ + int result = OK; + int call_nr; + +#if DEBUG_IPC_HOOK + hook_ipc_msgkcall(msg, caller); +#endif + call_nr = msg->m_type - KERNEL_CALL; + + /* See if the caller made a valid request and try to handle it. */ + if (call_nr < 0 || call_nr >= NR_SYS_CALLS) { /* check call number */ + printf("SYSTEM: illegal request %d from %d.\n", + call_nr,msg->m_source); + result = EBADREQUEST; /* illegal message type */ + } + else if (!GET_BIT(priv(caller)->s_k_call_mask, call_nr)) { + printf("SYSTEM: denied request %d from %d.\n", + call_nr,msg->m_source); + result = ECALLDENIED; /* illegal message type */ + } else { + /* handle the system call */ + if (call_vec[call_nr]) + result = (*call_vec[call_nr])(caller, msg); + else { + printf("Unused kernel call %d from %d\n", + call_nr, caller->p_endpoint); + result = EBADREQUEST; + } + } + + return result; +} + +/*===========================================================================* + * kernel_call * + *===========================================================================*/ +/* + * this function checks the basic syscall parameters and if accepted it + * dispatches its handling to the right handler + */ +void kernel_call(message *m_user, struct proc * caller) +{ + int result = OK; + message msg; + + caller->p_delivermsg_vir = (vir_bytes) m_user; + /* + * the ldt and cr3 of the caller process is loaded because it just've trapped + * into the kernel or was already set in switch_to_user() before we resume + * execution of an interrupted kernel call + */ + if (copy_msg_from_user(m_user, &msg) == 0) { + msg.m_source = caller->p_endpoint; + result = kernel_call_dispatch(caller, &msg); + } + else { + printf("WARNING wrong user pointer 0x%08x from process %s / %d\n", + m_user, caller->p_name, caller->p_endpoint); + cause_sig(proc_nr(caller), SIGSEGV); + return; + } + + + /* remember who invoked the kcall so we can bill it its time */ + kbill_kcall = caller; + + kernel_call_finish(caller, &msg, result); +} + +/*===========================================================================* + * initialize * + *===========================================================================*/ +void system_init(void) +{ + register struct priv *sp; + int i; + + /* Initialize IRQ handler hooks. Mark all hooks available. */ + for (i=0; is_alarm_timer)); + } + + /* Initialize the call vector to a safe default handler. Some system calls + * may be disabled or nonexistant. Then explicitly map known calls to their + * handler functions. This is done with a macro that gives a compile error + * if an illegal call number is used. The ordering is not important here. + */ + for (i=0; is_proc_nr == NONE) break; + if (sp >= END_DYN_PRIV_ADDR) return(ENOSPC); + } + else { /* allocate slot from id */ + if(!is_static_priv_id(priv_id)) { + return EINVAL; /* invalid static priv id */ + } + if(priv[priv_id].s_proc_nr != NONE) { + return EBUSY; /* slot already in use */ + } + sp = &priv[priv_id]; + } + rc->p_priv = sp; /* assign new slot */ + rc->p_priv->s_proc_nr = proc_nr(rc); /* set association */ + + return(OK); +} + +/*===========================================================================* + * set_sendto_bit * + *===========================================================================*/ +void set_sendto_bit(const struct proc *rp, int id) +{ +/* Allow a process to send messages to the process(es) associated with the + * system privilege structure with the given ID. + */ + + /* Disallow the process from sending to a process privilege structure with no + * associated process, and disallow the process from sending to itself. + */ + if (id_to_nr(id) == NONE || priv_id(rp) == id) { + unset_sys_bit(priv(rp)->s_ipc_to, id); + return; + } + + set_sys_bit(priv(rp)->s_ipc_to, id); + + /* The process that this process can now send to, must be able to reply (or + * vice versa). Therefore, its send mask should be updated as well. Ignore + * receivers that don't support traps other than RECEIVE, they can't reply + * or send messages anyway. + */ + if (priv_addr(id)->s_trap_mask & ~((1 << RECEIVE))) + set_sys_bit(priv_addr(id)->s_ipc_to, priv_id(rp)); +} + +/*===========================================================================* + * unset_sendto_bit * + *===========================================================================*/ +void unset_sendto_bit(const struct proc *rp, int id) +{ +/* Prevent a process from sending to another process. Retain the send mask + * symmetry by also unsetting the bit for the other direction. + */ + + unset_sys_bit(priv(rp)->s_ipc_to, id); + + unset_sys_bit(priv_addr(id)->s_ipc_to, priv_id(rp)); +} + +/*===========================================================================* + * fill_sendto_mask * + *===========================================================================*/ +void fill_sendto_mask(const struct proc *rp, sys_map_t *map) +{ + int i; + + for (i=0; i < NR_SYS_PROCS; i++) { + if (get_sys_bit(*map, i)) + set_sendto_bit(rp, i); + else + unset_sendto_bit(rp, i); + } +} + +/*===========================================================================* + * send_sig * + *===========================================================================*/ +int send_sig(endpoint_t ep, int sig_nr) +{ +/* Notify a system process about a signal. This is straightforward. Simply + * set the signal that is to be delivered in the pending signals map and + * send a notification with source SYSTEM. + */ + register struct proc *rp; + struct priv *priv; + int proc_nr; + + if(!isokendpt(ep, &proc_nr) || isemptyn(proc_nr)) + return EINVAL; + + rp = proc_addr(proc_nr); + priv = priv(rp); + if(!priv) return ENOENT; + sigaddset(&priv->s_sig_pending, sig_nr); + increase_proc_signals(rp); + mini_notify(proc_addr(SYSTEM), rp->p_endpoint); + + return OK; +} + +/*===========================================================================* + * cause_sig * + *===========================================================================*/ +void cause_sig(proc_nr, sig_nr) +proc_nr_t proc_nr; /* process to be signalled */ +int sig_nr; /* signal to be sent */ +{ +/* A system process wants to send a signal to a process. Examples are: + * - HARDWARE wanting to cause a SIGSEGV after a CPU exception + * - TTY wanting to cause SIGINT upon getting a DEL + * - FS wanting to cause SIGPIPE for a broken pipe + * Signals are handled by sending a message to the signal manager assigned to + * the process. This function handles the signals and makes sure the signal + * manager gets them by sending a notification. The process being signaled + * is blocked while the signal manager has not finished all signals for it. + * Race conditions between calls to this function and the system calls that + * process pending kernel signals cannot exist. Signal related functions are + * only called when a user process causes a CPU exception and from the kernel + * process level, which runs to completion. + */ + register struct proc *rp, *sig_mgr_rp; + endpoint_t sig_mgr; + int sig_mgr_proc_nr; + int s; + + /* Lookup signal manager. */ + rp = proc_addr(proc_nr); + sig_mgr = priv(rp)->s_sig_mgr; + if(sig_mgr == SELF) sig_mgr = rp->p_endpoint; + + /* If the target is the signal manager of itself, send the signal directly. */ + if(rp->p_endpoint == sig_mgr) { + if(SIGS_IS_LETHAL(sig_nr)) { + /* If the signal is lethal, see if a backup signal manager exists. */ + sig_mgr = priv(rp)->s_bak_sig_mgr; + if(sig_mgr != NONE && isokendpt(sig_mgr, &sig_mgr_proc_nr)) { + priv(rp)->s_sig_mgr = sig_mgr; + priv(rp)->s_bak_sig_mgr = NONE; + sig_mgr_rp = proc_addr(sig_mgr_proc_nr); + RTS_UNSET(sig_mgr_rp, RTS_NO_PRIV); + cause_sig(proc_nr, sig_nr); /* try again with the new sig mgr. */ + return; + } + /* We are out of luck. Time to panic. */ + proc_stacktrace(rp); + panic("cause_sig: sig manager %d gets lethal signal %d for itself", + rp->p_endpoint, sig_nr); + } + sigaddset(&priv(rp)->s_sig_pending, sig_nr); + if(OK != send_sig(rp->p_endpoint, SIGKSIGSM)) + panic("send_sig failed"); + return; + } + + if((s = sigismember(&rp->p_pending, sig_nr)) < 0) + panic("sigismember failed"); + /* Check if the signal is already pending. Process it otherwise. */ + if (!s) { + sigaddset(&rp->p_pending, sig_nr); + increase_proc_signals(rp); + if (! (RTS_ISSET(rp, RTS_SIGNALED))) { /* other pending */ + RTS_SET(rp, RTS_SIGNALED | RTS_SIG_PENDING); + if(OK != send_sig(sig_mgr, SIGKSIG)) + panic("send_sig failed"); + } + } +} + +/*===========================================================================* + * sig_delay_done * + *===========================================================================*/ +void sig_delay_done(struct proc *rp) +{ +/* A process is now known not to send any direct messages. + * Tell PM that the stop delay has ended, by sending a signal to the process. + * Used for actual signal delivery. + */ + + rp->p_misc_flags &= ~MF_SIG_DELAY; + + cause_sig(proc_nr(rp), SIGSNDELAY); +} + +/*===========================================================================* + * send_diag_sig * + *===========================================================================*/ +void send_diag_sig(void) +{ +/* Send a SIGKMESS signal to all processes in receiving updates about new + * diagnostics messages. + */ + struct priv *privp; + endpoint_t ep; + + for (privp = BEG_PRIV_ADDR; privp < END_PRIV_ADDR; privp++) { + if (privp->s_proc_nr != NONE && privp->s_diag_sig == TRUE) { + ep = proc_addr(privp->s_proc_nr)->p_endpoint; + send_sig(ep, SIGKMESS); + } + } +} + +/*===========================================================================* + * clear_ipc * + *===========================================================================*/ +static void clear_ipc( + register struct proc *rc /* slot of process to clean up */ +) +{ +/* Clear IPC data for a given process slot. */ + struct proc **xpp; /* iterate over caller queue */ + + if (RTS_ISSET(rc, RTS_SENDING)) { + int target_proc; + + okendpt(rc->p_sendto_e, &target_proc); + xpp = &proc_addr(target_proc)->p_caller_q; /* destination's queue */ + while (*xpp) { /* check entire queue */ + if (*xpp == rc) { /* process is on the queue */ + *xpp = (*xpp)->p_q_link; /* replace by next process */ +#if DEBUG_ENABLE_IPC_WARNINGS + printf("endpoint %d / %s removed from queue at %d\n", + rc->p_endpoint, rc->p_name, rc->p_sendto_e); +#endif + break; /* can only be queued once */ + } + xpp = &(*xpp)->p_q_link; /* proceed to next queued */ + } + RTS_UNSET(rc, RTS_SENDING); + } + RTS_UNSET(rc, RTS_RECEIVING); +} + +/*===========================================================================* + * clear_endpoint * + *===========================================================================*/ +void clear_endpoint(rc) +register struct proc *rc; /* slot of process to clean up */ +{ + if(isemptyp(rc)) panic("clear_proc: empty process: %d", rc->p_endpoint); + + +#if DEBUG_IPC_HOOK + hook_ipc_clear(rc); +#endif + + /* Make sure that the exiting process is no longer scheduled. */ + RTS_SET(rc, RTS_NO_ENDPOINT); + if (priv(rc)->s_flags & SYS_PROC) + { + priv(rc)->s_asynsize= 0; + } + + /* If the process happens to be queued trying to send a + * message, then it must be removed from the message queues. + */ + clear_ipc(rc); + + /* Likewise, if another process was sending or receive a message to or from + * the exiting process, it must be alerted that process no longer is alive. + * Check all processes. + */ + clear_ipc_refs(rc, EDEADSRCDST); + +} + +/*===========================================================================* + * clear_ipc_refs * + *===========================================================================*/ +void clear_ipc_refs(rc, caller_ret) +register struct proc *rc; /* slot of process to clean up */ +int caller_ret; /* code to return on callers */ +{ +/* Clear IPC references for a given process slot. */ + struct proc *rp; /* iterate over process table */ + int src_id; + + /* Tell processes that sent asynchronous messages to 'rc' they are not + * going to be delivered */ + while ((src_id = has_pending_asend(rc, ANY)) != NULL_PRIV_ID) + cancel_async(proc_addr(id_to_nr(src_id)), rc); + + for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) { + if(isemptyp(rp)) + continue; + + /* Unset pending notification bits. */ + unset_sys_bit(priv(rp)->s_notify_pending, priv(rc)->s_id); + + /* Unset pending asynchronous messages */ + unset_sys_bit(priv(rp)->s_asyn_pending, priv(rc)->s_id); + + /* Check if process depends on given process. */ + if (P_BLOCKEDON(rp) == rc->p_endpoint) { + rp->p_reg.retreg = caller_ret; /* return requested code */ + clear_ipc(rp); + } + } +} + +/*===========================================================================* + * kernel_call_resume * + *===========================================================================*/ +void kernel_call_resume(struct proc *caller) +{ + int result; + + assert(!RTS_ISSET(caller, RTS_SLOT_FREE)); + assert(!RTS_ISSET(caller, RTS_VMREQUEST)); + + assert(caller->p_vmrequest.saved.reqmsg.m_source == caller->p_endpoint); + + /* + printf("KERNEL_CALL restart from %s / %d rts 0x%08x misc 0x%08x\n", + caller->p_name, caller->p_endpoint, + caller->p_rts_flags, caller->p_misc_flags); + */ + + /* re-execute the kernel call, with MF_KCALL_RESUME still set so + * the call knows this is a retry. + */ + result = kernel_call_dispatch(caller, &caller->p_vmrequest.saved.reqmsg); + /* + * we are resuming the kernel call so we have to remove this flag so it + * can be set again + */ + caller->p_misc_flags &= ~MF_KCALL_RESUME; + kernel_call_finish(caller, &caller->p_vmrequest.saved.reqmsg, result); +} + +/*===========================================================================* + * sched_proc * + *===========================================================================*/ +int sched_proc(struct proc *p, + int priority, + int quantum, + int cpu) +{ + if (p->p_priority >= 7 && !(p->p_quantum_size_ms == 500)){ + printf("qntm_size - %d qntm_left -> %d\n", p->p_quantum_size_ms, cpu_time_2_ms(p->p_cpu_time_left)); + } + /* Make sure the values given are within the allowed range.*/ + if ((priority < TASK_Q && priority != -1) || priority > NR_SCHED_QUEUES) + return(EINVAL); + + if (quantum < 1 && quantum != -1) + return(EINVAL); + +#ifdef CONFIG_SMP + if ((cpu < 0 && cpu != -1) || (cpu > 0 && (unsigned) cpu >= ncpus)) + return(EINVAL); + if (cpu != -1 && !(cpu_is_ready(cpu))) + return EBADCPU; +#endif + + /* In some cases, we might be rescheduling a runnable process. In such + * a case (i.e. if we are updating the priority) we set the NO_QUANTUM + * flag before the generic unset to dequeue/enqueue the process + */ + + /* FIXME this preempts the process, do we really want to do that ?*/ + + /* FIXME this is a problem for SMP if the processes currently runs on a + * different CPU */ + if (proc_is_runnable(p)) { +#ifdef CONFIG_SMP + if (p->p_cpu != cpuid && cpu != -1 && cpu != p->p_cpu) { + smp_schedule_migrate_proc(p, cpu); + } +#endif + + RTS_SET(p, RTS_NO_QUANTUM); + } + + if (proc_is_runnable(p)) + RTS_SET(p, RTS_NO_QUANTUM); + + if (priority != -1) + p->p_priority = priority; + if (quantum != -1) { + p->p_quantum_size_ms = quantum; + p->p_cpu_time_left = ms_2_cpu_time(quantum); + } +#ifdef CONFIG_SMP + if (cpu != -1) + p->p_cpu = cpu; +#endif + + /* Clear the scheduling bit and enqueue the process */ + RTS_UNSET(p, RTS_NO_QUANTUM); + + return OK; +} + diff --git a/kernel/kernel b/kernel/kernel index 52650d12cd591102eb08428de8b56576549ff0a3..67b784caae266f44b2f5ca9aeca90eace2edb3a1 100755 GIT binary patch delta 18700 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 b&o$NG@s(evB{*^on1sP>IoC`dG5P-iA#K0X diff --git a/kernel/system.c b/kernel/system.c index 2d1aee1..02e33fe 100644 --- a/kernel/system.c +++ b/kernel/system.c @@ -623,6 +623,9 @@ int sched_proc(struct proc *p, int quantum, int cpu) { + if (p->p_priority >= 7 && !(p->p_quantum_size_ms == 500)){ + printf("qntm_size - %d qntm_left -> %d\n", p->p_quantum_size_ms, cpu_time_2_ms(p->p_cpu_time_left)); + } /* Make sure the values given are within the allowed range.*/ if ((priority < TASK_Q && priority != -1) || priority > NR_SCHED_QUEUES) return(EINVAL); diff --git a/kernel/system.o b/kernel/system.o index a61055ed3da32ce00494bd0b67552830c8db2b25..8eedda250298afb1d8d864d9eae1cb13c3971981 100644 GIT binary patch delta 1988 zcmXw)e@xVM7{}k=`vC_Wzs8+xqH=l%XBq|+Bw8ZB1Og-_6;e0}(XqJ7fg=q%9TC#y zjD1I|%;Cmb>E@4h^N$=d8#HXo&9=5OH~X=W)QLZ3Nb=w*nHR208TdLB*FP6c9tew@>yl2! zI9md{nD_T+35kB`_=a;-`8vJxdpjsZ() zqJ4{5ns&|@H~&iW+F#EEZkleF*O)hpTz>iA>hjy?lYm|3376N>kZOMJ$~Jn~ni#E@c4Mt>%P#No3qzZb&C1{ZsRYr74lm(sQlG zmB_878MaW{Yli~e9l`cMejwO|V3+Vw2-)(CmgPXT(1-)J(su$!>Dz!Qjo%?1z(aMb z>>ukggoCsxRXhv_@bk35y3df9EeM0W|4`J{Xi zCCUo&F`!1hp7aAd)SJjvKtR2XTn%)n2gyA7Sn54w8PF#TanLaaHUfiM5GJ1lhSf*N zEx;-DQF1fziTYXc3E-l7gj@@Jp?;N=V>qckO%?+;>^wR00N*mO3HV+MZjLSq`MBr;`=H@)({RDOkxs4dB;;wWJrwQ!h~8 zs9sDy1yrb4lLbJ%dIMPvG^sa}h4Rj*A0SJCU`PW8$qhh{`Ws}4d^PF=bsh=dD z14h(8Bv%5X>SN>@;H>(2G7E^PUsalWyzWpwa9jN+G6%S;{s&nE%&5xrzWGpEcdZKzN`Lvv6QqK5xWs|Z+7-HfA13P3#r3v}7a#q=kRX&xrCP{-Tj_F1e4u`sF8$BZrT=dUa`mzBJ`-}^#yEu%^C-)N+>v@x7VKtx z8SpY$2OQG)kp-F?vR*2@mnbRu3Hn#a)=|2&u1XThv%RVuA{%7$$y)PD);s?Lj0qq^ delta 1833 zcmXw)eP~-{6o-E|A8nduX+{%P=+?AL+EnL0T3zRy+VyK|O}p03>S9Tw7A?aClx>XZ z=2dI0Slm`$HvF0sibx0R2A9Dm+fY)eg2M@l;J_~^e!~8!1B)B+{F>t*_dY!5ocDe2 zJ-P3jt35N_N2^_D%O_U;Vtr-2)<)Ogmf37YtqSKc>!5qJZ2`0Gao_F&J*^P;#P1gT zb~B&POD^!i|20mDx2o7`aq0sA)Lp*2q6gFaIHhWn=HlnDL&_=ofa$$U?qs z^f3L9&m0ccnCjqtFeepg3HnA|txLS^=AH6W)`;l{$Gn~> zaNcCYF>A(5gcEYV5Kee!g1`nd7mm694He8ZeU$;vn(UrTV`k`?eVM(xvQNsh)XC*q z0dxti5?~v>A9#`8XO2gswpdj9!E9W}?4$HYfFUJ&NuMR9?n|Mo7x-S|^U4LK&sC@| zS5^vLNnn^R<9E|#{HsEn6CYzjIH^3tf*#M*W7;<1W(IHUl53PmybYGwKd`J8(h$5?Kr6)Mv^2fh%6vi*Nch z1NQ;nX~8veHSn|g92o=tRKHGc0dA--kZXawy1PhxD^Nnp3oaqsfO7R^WIM2;$SxGr zFz^77(1KOuN}xe~z4|8gX7Wy;L%oZ<3+PqfL3RQu^)$I&wv75P*#cy34LnP31oo>x zPi~f1CIJ7rMVi5*bTrn^&iPQfI0Qw zNjV*_tIw00fCcqiPyKc`Ibrf#Ro+i72eHwpmk!HH~iK;UB=ioCmDf`InQc5Pxmb%yf13v!m A%>V!Z diff --git a/servers/sched/schedule.c b/servers/sched/schedule.c index 101a03d..8e922c4 100644 --- a/servers/sched/schedule.c +++ b/servers/sched/schedule.c @@ -319,18 +319,20 @@ static int schedule_process(struct schedproc * rmp, unsigned flags) else new_cpu = -1; - //processes are swapped here + //processors are swapped here if (rmp->priority >= 7 && rmp->max_priority == 7) { printf("MINIX: PID %d swapped in\n", _ENDPOINT_P(rmp->endpoint)); } + if ((err = sys_schedule(rmp->endpoint, new_prio, new_quantum, new_cpu)) != OK) { printf("PM: An error occurred when trying to schedule %d: %d\n", rmp->endpoint, err); } + return err; }