From 597818524277bf24a2d6b10f540cbf2c34c2bb34 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 25 Oct 2018 13:53:49 +0200 Subject: [PATCH] Add a "sleep" syscall that sleeps for N seconds. --- Kernel/ProcFileSystem.cpp | 4 ++-- Kernel/Syscall.cpp | 1 - Kernel/Task.cpp | 15 +++++++++------ Kernel/Task.h | 2 +- Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes Kernel/sync-sh | 1 + LibC/unistd.cpp | 5 +++++ LibC/unistd.h | 1 + Userland/.gitignore | 1 + Userland/Makefile | 9 +++++++-- Userland/sleep.cpp | 10 ++++++++++ 11 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 Userland/sleep.cpp diff --git a/Kernel/ProcFileSystem.cpp b/Kernel/ProcFileSystem.cpp index 5942e8559c..d6aa99bbc2 100644 --- a/Kernel/ProcFileSystem.cpp +++ b/Kernel/ProcFileSystem.cpp @@ -24,9 +24,9 @@ bool ProcFileSystem::initialize() auto stringImpl = StringImpl::createUninitialized(tasks.size() * 256, buffer); memset(buffer, 0, stringImpl->length()); char* ptr = buffer; - ptr += ksprintf(ptr, "PID OWNER STATE PPID NSCHED FDS NAME\n"); + ptr += ksprintf(ptr, "PID OWNER STATE PPID NSCHED FDS NAME\n"); for (auto* task : tasks) { - ptr += ksprintf(ptr, "%w %w:%w %b %w %w %w %s\n", + ptr += ksprintf(ptr, "%w %w:%w %b %w %x %w %s\n", task->pid(), task->uid(), task->gid(), diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index 538b635d15..762008e84f 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -61,7 +61,6 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) Console::the().putChar(arg1 & 0xff); break; case Syscall::Sleep: - //kprintf("syscall: sleep(%d)\n", arg1); current->sys$sleep(arg1); break; case Syscall::Spawn: diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 44240a77e5..9612a24cb9 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -10,6 +10,7 @@ #include #include "MemoryManager.h" #include "errno.h" +#include "i8253.h" //#define DEBUG_IO //#define TASK_DEBUG @@ -719,6 +720,14 @@ int Task::sys$kill(pid_t pid, int sig) return -1; } +int Task::sys$sleep(unsigned seconds) +{ + if (!seconds) + return 0; + sleep(seconds * TICKS_PER_SECOND); + return 0; +} + uid_t Task::sys$getuid() { return m_uid; @@ -773,12 +782,6 @@ void sleep(DWORD ticks) yield(); } -void Task::sys$sleep(DWORD ticks) -{ - ASSERT(this == current); - sleep(ticks); -} - Task* Task::kernelTask() { ASSERT(s_kernelTask); diff --git a/Kernel/Task.h b/Kernel/Task.h index 9d84877f89..13435fc528 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -91,7 +91,6 @@ public: int sys$seek(int fd, int offset); int sys$kill(pid_t pid, int sig); int sys$geterror() { return m_error; } - void sys$sleep(DWORD ticks); void sys$exit(int status); int sys$spawn(const char* path); pid_t sys$waitpid(pid_t); @@ -99,6 +98,7 @@ public: int sys$munmap(void*, size_t size); int sys$get_dir_entries(int fd, void*, size_t); int sys$getcwd(char*, size_t); + int sys$sleep(unsigned seconds); static void initialize(); diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index 182fabbb3f1c8812fbdba97dd26faf6846cd4807..da330ef7e331510de91b386c9be3a52985107048 100644 GIT binary patch delta 33339 zcmeHQdw5mFwVyf3k-b9_&N+GU2;^V_1PG9XAdf;#6dF|2@UY?)3sh*S@-QOzTt)dP$o;Lg*E!kjL`!d< zf9(Bb_?@+8*4lGs&t9`;W}Ts-?b8iypMESgIk+N8sj65wd60e0BZqFJG_!d^^5r`4 z^*+1w#=w16YSN0Ns^)&yxqfLXaeZ{IPoo|dEAQVY*mmyRxqgkhxVf(Xrli=pJUgIN zb2#^1`n)OWxt)iazY*2p0r+quB}YX-p%h>C*4a9vF;o;gUJ|`R4O8l#Prbm^psF}U zw91si8h9xr%aJOOE`9GD6^`}ZO_|L^K&9^xg;fO-gw`Nn&FxH^Ywjk!}yh~y3WNLjd(=k zK_xDtM<*yJe}d2ITx3NfLhc;h1~S3M+jI_GDqZwpN=6H$HC_k?y@0PW4seeBKE)#~;Y=EZBR zA*NtbO2~9wYvshsUmqOge6#OE>r?#{J&pjX+J~^j{M)noi}iSm!yt8rQaOTy1?e8d z#~Z;oPLS$Ce0n;B6@rz5R}0P+yg_iG;8MX`f%T-IMi{FF*9xu|+$4Cf;8sCuERx?L zNR31EBZAF>PYUi8Bm+R@o`ZSe5A+5S;}yYI1%EHt2@Jptb_so2Fi1Fpo(%HGns4p3 zK3|WIO5^cS7bB#uMVKnceH%2HPvZ9%%oU6ZQjej0>S}~Vg7m@@T_!k5aH@m#s$3Y; z1!oG*608!OCpcelf#4#+C4$QYmkU-4)(Wl>q<2B5$}-1J>ii%n zvtr>>8Cf$(Ez(6ubS*-1a^~QZJ7*c?m~}y&$!!8EE>n%q6Ik0qe6o?sk?5+$E&H3U zT%D118%Vdh?|?34p%wV#7TOG-Z1vM~81G>wd$TWA{zfk#6L>^eVJdZvv? z?%R^>VGV=7iBE0~J6#&mOhrHs3J!+kD6=@A^T+IQ<@SRl^&8U9MiLlri%N)$<{CZ< zu3LY*O9MV8G_>KfyN0)cNFfc8c27>7j-{Wb<59aAY8RmlRVxoEu6ChE{PEP-Z%=1OZuE$EW|@zoIy+3y4u2|s zw@~cW(>V`p)XC}Y@6eQOt{JMcO>)1KP;fcCvrz2V>5T9e5l-TYDpeP2d@m>b0JzlA z&f{i1oi+ z>8?||3+@Awc>nW5>(YAaBmuZ}Xi=r{s!@L?qz)9o zZ3s2I#sZ=z!$t}{Me@ni2hdfP5Td!+M56p^$!`Rb`~yN$jfrk{=z5-hp=DJXJ#%E_ z0Rt1^>=2eHHJSKhl=?K$MVLzxjdE8JjS5~zI8v#_gs8|&x&b;x5TEq`yr_cL3oaAf z&4?jwHVO2Hjh76Xa+2U3f*S;XF4%`^KFJJU1y3)PWCw}=jHbhVl?GDxBc$g}i25<2 zp&7Xq!Ds&&SRwpM!K(%53f>?{V-x9H>R`RPRTwpb)a+DXt>AjWO@j9dZWUzz8Rd5f zO&yHn9}%R-MD&w_dj+3iT*MAE7dRvtuL!;>_8_u$7I6pR1^ z6IwpH#a^xJK~O*aJNP)N9QUoK8&8)CaQ^~L9iRABg6I1jWEce-_*zjJpLl3vLm-U+_V}ZGzhcn*_fvxKr>k!N&z#1@{QH;r?8K{lYjP z*e-ZbutV^$;1R*2g2x5l6zmi{A^5)FDZw*>>L$F})O74i1KF1bvM&u}UmD21G?0C1 zAp6ol9+!daO9R=L2C^?5X?bCV9nuM3bhJ4=P}exkTwAP?2r`Ige$d3V`-A9# z3}1Upc#S`G1r~}g>M9X9 zKO2Oe!E`{;@JAO0AmnE!{4mFF>Z2ayTqSPP0QIm#r?9&d!NN_GIn=4Y>RL*x$IHSi zX}N^MoS~ll5V{2|B+>H?phL|h8Ww~75%?|aj{w;p0kS^=WPb!Wo618uyCb049RadC z0%Uh28w+^sk7S$Ed#zg>KLi~sOv32U_+w;01Vp~js2}s$4*`FI(CmkRt`M625YX(0 z0ND=#vL6CmDCL$qD1HbsY9wQ|Ap0TUuNRsg1XYmz5a3p!*$)A|LumFxK(ikLWIqJR zeh6@{lzWD;O8gLH9FmMz1lbP(pZyRZ4LbB#x+I_d5b%RUqkCakfIr-FO}k#LTW()& zZw#2d@9F1xcxb^=MVa2(fFa>=v@~_b(PrIbD}U=jJFy!#Wp@CKb1Z0#e{@bFm(!!RTUho?-*2Ava57h@40GY-ZUcjZh@0oO+1 zawNK%pp^y&>e}R|#ZA^wkMyr%ySj3w(Sn0p`Z!(&t~(^@Wr<6BXS*L-Xc@CBsx!ju zl6rbm$(WNJ z4UCr+c+e$8!-`x<2;;h#aBTNB#vPJB6ZmHs|Gba0{=V_2LF8|4{O4=CkZd8I>S$B* zYrWDGzsRQh*aTf^KZq>0_NL?#z1Kbf(y{cq1Gz^*IwpKJktY)54v-JLtdoOIZWrZ- z(8nCI;w6yL1ljnKj{Eywlb&XFy`*!pye54RY>KnU>NV@d(0U=)~5OnJDD0QVcTb= z@N#Pp>wczp>we+_t$UF2ethiF*B0yh zV&UWD#gl_b7Y*|8;$xQ{?{?x>aZa}r{}rL*PJDyVr9g7xzb5pJOa~H+sWhCDjc=6v zxD)>`LOW}p1Jrhh?snq86FYXiuG@#7Qa=w&=0g{=gJCj+TF7y>b|Cwg|N;%zjB{n6eEzvxhJK zMz6kjE7V+w(SDtL@yT9;eJVbX;Cp_O!A^^5xVc_8yuf9vtqZi(4ZXYJZ7y+o3*(al zuN!^@BS$Z8cxSI}__p2+^_mMb)a|{x;mqyfhPQvL8{W=tIOTh6bT0bWe>iUV;kX-q zDY@Zg)je&ry8fGW1=jlGC(f-tbKR!buXjaq&6#sc$}-jb<&NumH{#*B%a>NyMu*)V zUA6S)l`EF4N-;HMDbHPiMXw*lb3{B2z9>AaZ=3)Uji%&_I=05L!XTjuC?Cc%aS>gT zpqzYKXrK$t0~?-vemGY>SXXhjGZTua6i+x;&=bxz&=bxz(i6_r*AvcVd&0T;pBK)B zeTH05JXfYCoGU#M&UFcY18+E2wkMpck0+dKKw?X80?Vf+w)8NI=!@@s~RRH`eE;7k9L&C*MO`t8l=LKVk?#$*JeVLKwNaU5{i!hE9^w*lY zq$U3JwI+Q@ckGMZgcf%OA&ggf`W6#jr$^}3v5I#_*n5!Y3|Clu(ko+);B_W=Sbfs> z#*V!+LK~y+g3!aUl6Obw@0r;k>|FQYmZy)Hn*w@-N$p;g(&?rP1)@<#&&V;ZRC$GAy0Ma5Tk-!&SU0RTo7Y;ws~R3)K`gxn=w! z>x}K$dq^_3m8Cp;{?C5KjS+LTYf9Z=-#t9`3sue>!6ZFlkE@TW z_`D>A#rnrL7t}7Mha^S-N6m1xQ`C@e8i9##7CJspdQ#|8&QDiA6M7Gp8fh);X`wHt z{G}Muo)ZT3O`16UTIl%1={G{hCr-zNjt^092u+rqMkrcCr;A!KqApfyxfwDkrO1@- zwr`c`)!O8gx%J22|gl7FBmC&QgE*zPfWq5_lNQi3BDrus^ISh>Aj#n)8)_$ z)oIBHQU<<0w(k(s;%o*GGL2V(ECaoW(8t~$O_a;^zDY&#w4=@ZJFF)V z!_aEBx7h`D0iM|@$V{Y}Zl39Ev#ab}yqe@OOyupV1#7HAdsc!)+f_T)SljJ7u- z-ma>93c(HcgF&5WqO)VwPQ0cBZzyd>9%-p61Sa!a_+A)1#i|s)==Tm zFx90Y>eBF8kA`{B(2q6D@o1Rt(r~d$!%~lio1wv3+a=5D{uZ-bU!A5I@y5Huqv0FS zFpBFyfun8>3tSp#UKrQ#HIIfT5*pTdG%R;%Ao~{AaGz+vtHRg+K*JXtAB~n-@rPm1 zxn@%I>g4Zw6xTsfBTeB195NF5Z^?;Q zIF#-zHGk-lXp24nhn#8edG6PV`z^v3qT0erBx-AchoXrcLt4R7^eD2@kwaZD35l-m zoQz&_ct0^RM6@{)BxA-tYYk5$*>W_{BxDphJBr0HTwTsm#w_&kv4|Y`y1&}Y4d<^m zqfh4e5hL!15r4JWHG1ML@kW05tIY{R{nuY@_JcmUO>~p-gFf&+lD+0h8IUJszWsJZ z{P{s2=ezZO&<7l4nlubUiccK8A$@+(2O5Wdp|%Q07fs)2d+jSsIic?qx!oW%&5Zn@ z4?l3*Ie-BJ5HGF)d2tQci4OAT1#bIpxbKEL8wBV|@s*Lkbq-o!L@?^=9~K$V*civDo4kl z%inzC{hEu>6!A%-zxl>J!{2<1JD;?*_Ltjy^AEj2_woJ^o9fq)zj1mt)iAjbm%IUWee@jwF?`G?;4hu-k1y>uo`2lXM~VZkGU zM+J`yz9~q{SXBOm;QNB71kVWihu-*y-k>We|IiyWf^!y*f9MT$i0-Wuim#GAA%)R-jN0Jjx3OOWP!XR3*;SHAn(Wmc}Et=JF-CDkp=ROY)+Mb{I`GnH+~3D zzlF!#lrR7I?>~P0w;${6^cCl~Nq(%iAM34g$crEA?ZnaFis5SMzkXu!j;#yV}+j%lH~ccJOGvC!^LUMD?{Fn0?@Wgngt)(9Ti>UmuoXoq@`C z2J`chgJnZ%$Cr47sCei1msN6gRT5$m?ia(Bz#f4;3R?3@eAtgUt`N3@eB$_h5)Hj^U{aK0W-FVA=4rpBMUT9F?!noKzmY z%VLq`i^{gkt(K<`dgSb&_h3e7Y`J_knyxm~x8&F({S>=ICDPJVdsC?S&vKiUwggmv znL+yks#LC_oJy7M>?>~P9^#6EIfb95SE_*lKZr}DiV7~lH3;Uy1o5cyH3a4oaU!xB zcn)2d?J6$BH5ld+Nn*9hgz#YTxkR)GY942nr-)}YA8PU#@nV=${BpIB8sC$JSSrE` zQ&$U-1C*E{ez>|yh;f?#Ae8^UjJJ`kTKTLSoI?168{0F80-%wOaLJqtDAD(xLwHVOEaus4pdnn8KT&0wYF_Zoe`H!u zI)wNoIp?ZOYhAJszYXn~Wch_{rQw@S46#EHGP*Y=B(z)L@CvK9}e%R_O9DH^eH<`J+ zSs_Eexy2SOX|K&biFUWD`-APrS5w;|32W23w0W#; zVQqGowuiNgtS#=+oK?~tjOoahV}r%*@#Z0w^F*W+PsHLd0|Kx41RiN%FBo5y7^m%A zE!_bbN0KOF8P^81z%?*EA{8f>5g!|=l;2y3e&(}$t%f7Ewwq@y7Z}V|uiC zl_RIFn}-|iMZvi3@Av4<9jN9vt8ID`)wXqe32(P*xAmyD0@Vg_wb4_1yhLNS7I=e1 z9?UBie_g|{rK^Rzd$iEptp#3VkrvFg4vwW}ULT=_`)IpI##5OWC-tb{<-~V;%8`KKJfPdr&7d8Q9Yz!!+R(@l+UQem>rpJ%FF1hsq7wPe+e_}=SuQ;( zA(J{leYlAWfbc{A~6(dc+*Vs;7JuUgVh;Odxh8I^N_9g zfWN>zQwe+UrqfAuoV}~)8}=^2F;GJJPhk{_yfQ|PqRC#2&n_C%iX3MR7PPgAPgE-P zSrX_Cuk53m&`LW}9$xHC)DCw@^uYx=0CaQ)8co4mycteF&fqZJ9l`>-O};eFo`R(l zzc-B+$E7@A2u{WVo18Bb&BfIF5Xx3|s2@9~PNjC6%*PC3S&fv%bcZ2_&^oE|)UluN zs+wk_Y`gk0l(9s0M3LR0+9H{QhvJSQbNJPCRYX7I%%R$;GB|xmp|uI?s(JDi zn(IRPoGQxA9)&lbQ{>QdE~L+VZnzLLt92pPCb(PFXwJKp(__+{PXrFc&ucyh3)hAH zyixPPW_gOJ(>xsM4Y5u0aHQ`iLSb$f;ZPqZ8fZqmdWNc!VT&)4OPbUD8q*I%#stD4t`c|bJr4Yp+z-i{rU zczfb0nT)vzldL2D4rPv4=55S=*E2^4Coy6ur!k@<6ZruM-d5bp6x7#vn@0ZRVtuEH z0et>)g=FkVU2ucOg&M0g{!U{wcX(Jh`QeV?*=7e*H4e~djws5_5e4?-cn2W^DDdbC zrT}gZIWUHG)W(t*60sM3G?B9|=DeO52WrG%nH+;>B9a;t$7r0Oak9p#zyLRJyB6-! zc(29>HO|w>bISh9G_KURO5;-+*J*rC<3^1yYuu_4Yan1Y_@)+iYkWuJK8-CJTQzcO z${qQu#^XR<3#T+cud(NlTUp1*y4b$}{{+2NrG8C+OIEu=Uze)K6h-%wXM#n?U39*m zT)O^i`6%V3tC_~d`0zaCQVxfNIcAVB(y&psp_N=(mL}bZ31*;ZH3NmQABA~lVQGKm zmVYnEd~@{qej}X528wLFG5ir5UU~ z)D=05Tf0iOa!HLDJE+`^@6+rG!-uHLfdeP~5{A#skb#r@J!VEYR3ziL@4OT$o}n=d z5I~abkpNQ30puXnusQ;2IDj;>dX$c^S_)MM5YIx$vnYQdWPC$)j}+=m60KNh3{WM# z&7jiAu3M;uU3bAX{DtdS1ht90ixBP>#|6JVl|(aHDx-OjWF2{Zh&&#ilsVhd5nFBNoHGkV*m8z1U-&{81aQ?EF-Ed{=%qx$?Wof9`h^PFb2SPg&k5 zP+!l# z4JRT&TJ- diff --git a/Kernel/sync-sh b/Kernel/sync-sh index e2d1e6cd2a..b19da4ba8f 100755 --- a/Kernel/sync-sh +++ b/Kernel/sync-sh @@ -5,5 +5,6 @@ cp ../Userland/id mnt/bin/id cp ../Userland/ps mnt/bin/ps cp ../Userland/ls mnt/bin/ls cp ../Userland/pwd mnt/bin/pwd +cp ../Userland/sleep mnt/bin/sleep umount mnt sync diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index 335645e91b..82077c5a52 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -57,5 +57,10 @@ char* getcwd(char* buffer, size_t size) __RETURN_WITH_ERRNO(rc, buffer, nullptr); } +int sleep(unsigned seconds) +{ + return Syscall::invoke(Syscall::Sleep, (dword)seconds); +} + } diff --git a/LibC/unistd.h b/LibC/unistd.h index 96603a6795..2f8f1b5c4e 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -13,6 +13,7 @@ int close(int fd); pid_t waitpid(pid_t); char* getcwd(char* buffer, size_t size); int lstat(const char* path, stat* statbuf); +int sleep(unsigned seconds); #define S_IFMT 0170000 #define S_IFDIR 0040000 diff --git a/Userland/.gitignore b/Userland/.gitignore index ed1a6797f5..9effb83fcc 100644 --- a/Userland/.gitignore +++ b/Userland/.gitignore @@ -3,4 +3,5 @@ sh ps ls pwd +sleep *.o diff --git a/Userland/Makefile b/Userland/Makefile index 2a866fcc04..20e729d999 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -3,14 +3,16 @@ OBJS = \ sh.o \ ps.o \ ls.o \ - pwd.o + pwd.o \ + sleep.o APPS = \ id \ sh \ ps \ ls \ - pwd + pwd \ + sleep ARCH_FLAGS = STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib @@ -45,6 +47,9 @@ ls: ls.o pwd: pwd.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a +sleep: sleep.o + $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a + .cpp.o: @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< diff --git a/Userland/sleep.cpp b/Userland/sleep.cpp new file mode 100644 index 0000000000..c0e7c44eea --- /dev/null +++ b/Userland/sleep.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main(int c, char** v) +{ + unsigned secs = 10; + sleep(secs); + return 0; +} +