lwp_syscall.c 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-06-10 Bernard first version
  9. * 2021-02-03 lizhirui add limit condition for network syscall and add 64-bit arch support
  10. * 2021-02-06 lizhirui fix some bugs
  11. * 2021-02-12 lizhirui add 64-bit support for sys_brk
  12. * 2021-02-20 lizhirui fix some warnings
  13. */
  14. /* RT-Thread System call */
  15. #include <rthw.h>
  16. #include <board.h>
  17. #include <lwp.h>
  18. #ifdef RT_USING_USERSPACE
  19. #include <lwp_user_mm.h>
  20. #endif
  21. #ifdef RT_USING_DFS
  22. #include <dfs_poll.h>
  23. #include <dfs_posix.h>
  24. #include <dfs_select.h>
  25. #endif
  26. #if (defined(RT_USING_SAL) && defined(SAL_USING_POSIX))
  27. #include <sys/socket.h>
  28. #define SYSCALL_NET(f) ((void *)(f))
  29. #else
  30. #define SYSCALL_NET(f) ((void *)sys_notimpl)
  31. #endif
  32. #if defined(RT_USING_DFS) && defined(RT_USING_USERSPACE)
  33. #define SYSCALL_USPACE(f) ((void *)(f))
  34. #else
  35. #define SYSCALL_USPACE(f) ((void *)sys_notimpl)
  36. #endif
  37. #define DBG_TAG "SYSCALL"
  38. #define DBG_LVL DBG_INFO
  39. #include <rtdbg.h>
  40. #ifdef RT_USING_SAL
  41. #include <netdev_ipaddr.h>
  42. #include <netdev.h>
  43. #include <sal_netdb.h>
  44. #include <sal.h>
  45. #endif /* RT_USING_SAL */
  46. #include <lwp_console.h>
  47. #include "lwp_ipc_internal.h"
  48. #define ALLOC_KERNEL_STACK_SIZE 5120
  49. struct musl_sockaddr
  50. {
  51. uint16_t sa_family;
  52. char sa_data[14];
  53. };
  54. extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack);
  55. extern void set_user_context(void *stack);
  56. void lwp_cleanup(struct rt_thread *tid);
  57. #ifdef RT_USING_USERSPACE
  58. static void *kmem_get(size_t size)
  59. {
  60. return rt_malloc(size);
  61. }
  62. static void kmem_put(void *kptr)
  63. {
  64. rt_free(kptr);
  65. }
  66. #endif
  67. int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3);
  68. /* The same socket option is defined differently in the user interfaces and the
  69. * implementation. The options should be converted in the kernel. */
  70. /* socket levels */
  71. #define INTF_SOL_SOCKET 1
  72. #define IMPL_SOL_SOCKET 0xFFF
  73. #define INTF_IPPROTO_IP 0
  74. #define IMPL_IPPROTO_IP 0
  75. #define INTF_IPPROTO_TCP 6
  76. #define IMPL_IPPROTO_TCP 6
  77. #define INTF_IPPROTO_IPV6 41
  78. #define IMPL_IPPROTO_IPV6 41
  79. /* SOL_SOCKET option names */
  80. #define INTF_SO_BROADCAST 6
  81. #define INTF_SO_KEEPALIVE 9
  82. #define INTF_SO_REUSEADDR 2
  83. #define INTF_SO_TYPE 3
  84. #define INTF_SO_ERROR 4
  85. #define INTF_SO_SNDTIMEO 21
  86. #define INTF_SO_RCVTIMEO 20
  87. #define INTF_SO_RCVBUF 8
  88. #define INTF_SO_LINGER 13
  89. #define INTF_SO_NO_CHECK 11
  90. #define INTF_SO_ACCEPTCONN 30
  91. #define INTF_SO_DONTROUTE 5
  92. #define INTF_SO_OOBINLINE 10
  93. #define INTF_SO_REUSEPORT 15
  94. #define INTF_SO_SNDBUF 7
  95. #define INTF_SO_SNDLOWAT 19
  96. #define INTF_SO_RCVLOWAT 18
  97. #define IMPL_SO_BROADCAST 0x0020
  98. #define IMPL_SO_KEEPALIVE 0x0008
  99. #define IMPL_SO_REUSEADDR 0x0004
  100. #define IMPL_SO_TYPE 0x1008
  101. #define IMPL_SO_ERROR 0x1007
  102. #define IMPL_SO_SNDTIMEO 0x1005
  103. #define IMPL_SO_RCVTIMEO 0x1006
  104. #define IMPL_SO_RCVBUF 0x1002
  105. #define IMPL_SO_LINGER 0x0080
  106. #define IMPL_SO_NO_CHECK 0x100a
  107. #define IMPL_SO_ACCEPTCONN 0x0002
  108. #define IMPL_SO_DONTROUTE 0x0010
  109. #define IMPL_SO_OOBINLINE 0x0100
  110. #define IMPL_SO_REUSEPORT 0x0200
  111. #define IMPL_SO_SNDBUF 0x1001
  112. #define IMPL_SO_SNDLOWAT 0x1003
  113. #define IMPL_SO_RCVLOWAT 0x1004
  114. /* IPPROTO_IP option names */
  115. #define INTF_IP_TTL 2
  116. #define INTF_IP_TOS 1
  117. #define INTF_IP_MULTICAST_TTL 33
  118. #define INTF_IP_MULTICAST_IF 32
  119. #define INTF_IP_MULTICAST_LOOP 34
  120. #define INTF_IP_ADD_MEMBERSHIP 35
  121. #define INTF_IP_DROP_MEMBERSHIP 36
  122. #define IMPL_IP_TTL 2
  123. #define IMPL_IP_TOS 1
  124. #define IMPL_IP_MULTICAST_TTL 5
  125. #define IMPL_IP_MULTICAST_IF 6
  126. #define IMPL_IP_MULTICAST_LOOP 7
  127. #define IMPL_IP_ADD_MEMBERSHIP 3
  128. #define IMPL_IP_DROP_MEMBERSHIP 4
  129. /* IPPROTO_TCP option names */
  130. #define INTF_TCP_NODELAY 1
  131. #define INTF_TCP_KEEPALIVE 9
  132. #define INTF_TCP_KEEPIDLE 4
  133. #define INTF_TCP_KEEPINTVL 5
  134. #define INTF_TCP_KEEPCNT 6
  135. #define IMPL_TCP_NODELAY 0x01
  136. #define IMPL_TCP_KEEPALIVE 0x02
  137. #define IMPL_TCP_KEEPIDLE 0x03
  138. #define IMPL_TCP_KEEPINTVL 0x04
  139. #define IMPL_TCP_KEEPCNT 0x05
  140. /* IPPROTO_IPV6 option names */
  141. #define INTF_IPV6_V6ONLY 26
  142. #define IMPL_IPV6_V6ONLY 27
  143. static void convert_sockopt(int *level, int *optname)
  144. {
  145. if (*level == INTF_SOL_SOCKET)
  146. {
  147. *level = IMPL_SOL_SOCKET;
  148. switch (*optname)
  149. {
  150. case INTF_SO_REUSEADDR:
  151. *optname = IMPL_SO_REUSEADDR;
  152. break;
  153. case INTF_SO_KEEPALIVE:
  154. *optname = IMPL_SO_KEEPALIVE;
  155. break;
  156. case INTF_SO_BROADCAST:
  157. *optname = IMPL_SO_BROADCAST;
  158. break;
  159. case INTF_SO_ACCEPTCONN:
  160. *optname = IMPL_SO_ACCEPTCONN;
  161. break;
  162. case INTF_SO_DONTROUTE:
  163. *optname = IMPL_SO_DONTROUTE;
  164. break;
  165. case INTF_SO_LINGER:
  166. *optname = IMPL_SO_LINGER;
  167. break;
  168. case INTF_SO_OOBINLINE:
  169. *optname = IMPL_SO_OOBINLINE;
  170. break;
  171. case INTF_SO_REUSEPORT:
  172. *optname = IMPL_SO_REUSEPORT;
  173. break;
  174. case INTF_SO_SNDBUF:
  175. *optname = IMPL_SO_SNDBUF;
  176. break;
  177. case INTF_SO_RCVBUF:
  178. *optname = IMPL_SO_RCVBUF;
  179. break;
  180. case INTF_SO_SNDLOWAT:
  181. *optname = IMPL_SO_SNDLOWAT;
  182. break;
  183. case INTF_SO_RCVLOWAT:
  184. *optname = IMPL_SO_RCVLOWAT;
  185. break;
  186. case INTF_SO_SNDTIMEO:
  187. *optname = IMPL_SO_SNDTIMEO;
  188. break;
  189. case INTF_SO_RCVTIMEO:
  190. *optname = IMPL_SO_RCVTIMEO;
  191. break;
  192. case INTF_SO_ERROR:
  193. *optname = IMPL_SO_ERROR;
  194. break;
  195. case INTF_SO_TYPE:
  196. *optname = IMPL_SO_TYPE;
  197. break;
  198. case INTF_SO_NO_CHECK:
  199. *optname = IMPL_SO_NO_CHECK;
  200. break;
  201. /*
  202. * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
  203. * SO_USELOOPBACK (*level = 0x0040) and
  204. * SO_CONTIMEO (*level = 0x1009) are not supported for now.
  205. */
  206. default:
  207. *optname = 0;
  208. break;
  209. }
  210. return;
  211. }
  212. if (*level == INTF_IPPROTO_IP)
  213. {
  214. *level = IMPL_IPPROTO_IP;
  215. switch (*optname)
  216. {
  217. case INTF_IP_TTL:
  218. *optname = IMPL_IP_TTL;
  219. break;
  220. case INTF_IP_TOS:
  221. *optname = IMPL_IP_TOS;
  222. break;
  223. case INTF_IP_MULTICAST_TTL:
  224. *optname = IMPL_IP_MULTICAST_TTL;
  225. break;
  226. case INTF_IP_MULTICAST_IF:
  227. *optname = IMPL_IP_MULTICAST_IF;
  228. break;
  229. case INTF_IP_MULTICAST_LOOP:
  230. *optname = IMPL_IP_MULTICAST_LOOP;
  231. break;
  232. case INTF_IP_ADD_MEMBERSHIP:
  233. *optname = IMPL_IP_ADD_MEMBERSHIP;
  234. break;
  235. case INTF_IP_DROP_MEMBERSHIP:
  236. *optname = IMPL_IP_DROP_MEMBERSHIP;
  237. break;
  238. default:
  239. break;
  240. }
  241. }
  242. if (*level == INTF_IPPROTO_TCP)
  243. {
  244. *level = IMPL_IPPROTO_TCP;
  245. switch (*optname)
  246. {
  247. case INTF_TCP_NODELAY:
  248. *optname = IMPL_TCP_NODELAY;
  249. break;
  250. case INTF_TCP_KEEPALIVE:
  251. *optname = IMPL_TCP_KEEPALIVE;
  252. break;
  253. case INTF_TCP_KEEPIDLE:
  254. *optname = IMPL_TCP_KEEPIDLE;
  255. break;
  256. case INTF_TCP_KEEPINTVL:
  257. *optname = IMPL_TCP_KEEPINTVL;
  258. break;
  259. case INTF_TCP_KEEPCNT:
  260. *optname = IMPL_TCP_KEEPCNT;
  261. break;
  262. default:
  263. break;
  264. }
  265. return;
  266. }
  267. if (*level == INTF_IPPROTO_IPV6)
  268. {
  269. *level = IMPL_IPPROTO_IPV6;
  270. switch (*optname)
  271. {
  272. case INTF_IPV6_V6ONLY:
  273. *optname = IMPL_IPV6_V6ONLY;
  274. break;
  275. default:
  276. break;
  277. }
  278. return;
  279. }
  280. }
  281. #ifdef RT_USING_LWIP
  282. static void sockaddr_tolwip(const struct musl_sockaddr *std, struct sockaddr *lwip)
  283. {
  284. if (std && lwip)
  285. {
  286. lwip->sa_len = sizeof(*lwip);
  287. lwip->sa_family = (sa_family_t) std->sa_family;
  288. memcpy(lwip->sa_data, std->sa_data, sizeof(lwip->sa_data));
  289. }
  290. }
  291. static void sockaddr_tomusl(const struct sockaddr *lwip, struct musl_sockaddr *std)
  292. {
  293. if (std && lwip)
  294. {
  295. std->sa_family = (uint16_t) lwip->sa_family;
  296. memcpy(std->sa_data, lwip->sa_data, sizeof(std->sa_data));
  297. }
  298. }
  299. #endif
  300. static void lwp_user_thread(void *parameter)
  301. {
  302. rt_thread_t tid;
  303. rt_size_t user_stack;
  304. struct rt_lwp *lwp;
  305. tid = rt_thread_self();
  306. lwp = lwp_self();
  307. user_stack = (rt_size_t)tid->user_stack + tid->user_stack_size;
  308. user_stack &= ~7; //align 8
  309. set_user_context((void *)user_stack);
  310. lwp_user_entry(parameter, tid->user_entry, lwp->data_entry, RT_NULL);
  311. }
  312. /* thread/process */
  313. void sys_exit(int value)
  314. {
  315. rt_base_t level;
  316. rt_thread_t tid, main_thread;
  317. struct rt_lwp *lwp;
  318. LOG_D("thread/process exit.");
  319. tid = rt_thread_self();
  320. lwp = (struct rt_lwp *)tid->lwp;
  321. level = rt_hw_interrupt_disable();
  322. if (tid->clear_child_tid)
  323. {
  324. int t = 0;
  325. int *clear_child_tid = tid->clear_child_tid;
  326. tid->clear_child_tid = RT_NULL;
  327. lwp_put_to_user(clear_child_tid, &t, sizeof t);
  328. sys_futex(tid->clear_child_tid, FUTEX_WAKE, 1, RT_NULL, RT_NULL, 0);
  329. }
  330. main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
  331. if (main_thread == tid)
  332. {
  333. lwp_terminate(lwp);
  334. lwp_wait_subthread_exit();
  335. lwp->lwp_ret = value;
  336. }
  337. rt_thread_delete(tid);
  338. rt_schedule();
  339. rt_hw_interrupt_enable(level);
  340. return;
  341. }
  342. /* exit group */
  343. void sys_exit_group(int status)
  344. {
  345. return;
  346. }
  347. /* syscall: "read" ret: "ssize_t" args: "int" "void *" "size_t" */
  348. ssize_t sys_read(int fd, void *buf, size_t nbyte)
  349. {
  350. #ifdef RT_USING_USERSPACE
  351. void *kmem = RT_NULL;
  352. ssize_t ret = -1;
  353. if (!nbyte)
  354. {
  355. rt_set_errno(EINVAL);
  356. return -1;
  357. }
  358. if (!lwp_user_accessable((void *)buf, nbyte))
  359. {
  360. rt_set_errno(EINVAL);
  361. return -1;
  362. }
  363. kmem = kmem_get(nbyte);
  364. if (!kmem)
  365. {
  366. rt_set_errno(ENOMEM);
  367. return -1;
  368. }
  369. ret = read(fd, kmem, nbyte);
  370. if (ret > 0)
  371. {
  372. lwp_put_to_user(buf, kmem, ret);
  373. }
  374. kmem_put(kmem);
  375. return ret;
  376. #else
  377. return read(fd, buf, nbyte);
  378. #endif
  379. }
  380. /* syscall: "write" ret: "ssize_t" args: "int" "const void *" "size_t" */
  381. ssize_t sys_write(int fd, const void *buf, size_t nbyte)
  382. {
  383. #ifdef RT_USING_USERSPACE
  384. void *kmem = RT_NULL;
  385. ssize_t ret = -1;
  386. if (!nbyte)
  387. {
  388. rt_set_errno(EINVAL);
  389. return -1;
  390. }
  391. if (!lwp_user_accessable((void *)buf, nbyte))
  392. {
  393. rt_set_errno(EINVAL);
  394. return -1;
  395. }
  396. kmem = kmem_get(nbyte);
  397. if (!kmem)
  398. {
  399. rt_set_errno(ENOMEM);
  400. return -1;
  401. }
  402. lwp_get_from_user(kmem, (void *)buf, nbyte);
  403. ret = write(fd, kmem, nbyte);
  404. kmem_put(kmem);
  405. return ret;
  406. #else
  407. return write(fd, buf, nbyte);
  408. #endif
  409. }
  410. /* syscall: "lseek" ret: "off_t" args: "int" "off_t" "int" */
  411. off_t sys_lseek(int fd, off_t offset, int whence)
  412. {
  413. return lseek(fd, offset, whence);
  414. }
  415. /* syscall: "open" ret: "int" args: "const char *" "int" "..." */
  416. int sys_open(const char *name, int flag, ...)
  417. {
  418. #ifdef RT_USING_USERSPACE
  419. int ret = -1;
  420. rt_size_t len = 0;
  421. char *kname = RT_NULL;
  422. if (!lwp_user_accessable((void *)name, 1))
  423. {
  424. rt_set_errno(EINVAL);
  425. return -1;
  426. }
  427. len = rt_strlen(name);
  428. if (!len)
  429. {
  430. rt_set_errno(EINVAL);
  431. return -1;
  432. }
  433. kname = (char *)kmem_get(len + 1);
  434. if (!kname)
  435. {
  436. rt_set_errno(ENOMEM);
  437. return -1;
  438. }
  439. lwp_get_from_user(kname, (void *)name, len + 1);
  440. ret = open(kname, flag, 0);
  441. kmem_put(kname);
  442. return ret;
  443. #else
  444. return open(name, flag, 0);
  445. #endif
  446. }
  447. /* syscall: "close" ret: "int" args: "int" */
  448. int sys_close(int fd)
  449. {
  450. return close(fd);
  451. }
  452. /* syscall: "ioctl" ret: "int" args: "int" "u_long" "..." */
  453. int sys_ioctl(int fd, unsigned long cmd, void* data)
  454. {
  455. return ioctl(fd, cmd, data);
  456. }
  457. int sys_fstat(int file, struct stat *buf)
  458. {
  459. #ifdef RT_USING_USERSPACE
  460. int ret = -1;
  461. struct stat statbuff;
  462. ret = fstat(file, &statbuff);
  463. lwp_put_to_user(buf, &statbuff, sizeof statbuff);
  464. return ret;
  465. #else
  466. return fstat(file, buf);
  467. #endif
  468. }
  469. /* DFS and lwip definitions */
  470. #define IMPL_POLLIN (0x01)
  471. #define IMPL_POLLOUT (0x02)
  472. #define IMPL_POLLERR (0x04)
  473. #define IMPL_POLLHUP (0x08)
  474. #define IMPL_POLLNVAL (0x10)
  475. /* musl definitions */
  476. #define INTF_POLLIN 0x001
  477. #define INTF_POLLPRI 0x002
  478. #define INTF_POLLOUT 0x004
  479. #define INTF_POLLERR 0x008
  480. #define INTF_POLLHUP 0x010
  481. #define INTF_POLLNVAL 0x020
  482. #define INTF_POLLRDNORM 0x040
  483. #define INTF_POLLRDBAND 0x080
  484. #define INTF_POLLWRNORM 0x100
  485. #define INTF_POLLWRBAND 0x200
  486. #define INTF_POLLMSG 0x400
  487. #define INTF_POLLRDHUP 0x2000
  488. #define INTF_POLLIN_MASK (INTF_POLLIN | INTF_POLLRDNORM | INTF_POLLRDBAND | INTF_POLLPRI)
  489. #define INTF_POLLOUT_MASK (INTF_POLLOUT | INTF_POLLWRNORM | INTF_POLLWRBAND)
  490. static void musl2dfs_events(short *events)
  491. {
  492. short origin_e = *events;
  493. short result_e = 0;
  494. if (origin_e & INTF_POLLIN_MASK)
  495. {
  496. result_e |= IMPL_POLLIN;
  497. }
  498. if (origin_e & INTF_POLLOUT_MASK)
  499. {
  500. result_e |= IMPL_POLLOUT;
  501. }
  502. if (origin_e & INTF_POLLERR)
  503. {
  504. result_e |= IMPL_POLLERR;
  505. }
  506. if (origin_e & INTF_POLLHUP)
  507. {
  508. result_e |= IMPL_POLLHUP;
  509. }
  510. if (origin_e & INTF_POLLNVAL)
  511. {
  512. result_e |= IMPL_POLLNVAL;
  513. }
  514. *events = result_e;
  515. }
  516. static void dfs2musl_events(short *events)
  517. {
  518. short origin_e = *events;
  519. short result_e = 0;
  520. if (origin_e & IMPL_POLLIN)
  521. {
  522. result_e |= INTF_POLLIN_MASK;
  523. }
  524. if (origin_e & IMPL_POLLOUT)
  525. {
  526. result_e |= INTF_POLLOUT_MASK;
  527. }
  528. if (origin_e & IMPL_POLLERR)
  529. {
  530. result_e |= INTF_POLLERR;
  531. }
  532. if (origin_e & IMPL_POLLHUP)
  533. {
  534. result_e |= INTF_POLLHUP;
  535. }
  536. if (origin_e & IMPL_POLLNVAL)
  537. {
  538. result_e |= INTF_POLLNVAL;
  539. }
  540. *events = result_e;
  541. }
  542. int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
  543. {
  544. int ret = -1;
  545. int i = 0;
  546. #ifdef RT_USING_USERSPACE
  547. struct pollfd *kfds = RT_NULL;
  548. if (!lwp_user_accessable((void *)fds, nfds * sizeof *fds))
  549. {
  550. rt_set_errno(EINVAL);
  551. return -1;
  552. }
  553. kfds = (struct pollfd *)kmem_get(nfds * sizeof *kfds);
  554. if (!kfds)
  555. {
  556. rt_set_errno(ENOMEM);
  557. return -1;
  558. }
  559. lwp_get_from_user(kfds, fds, nfds * sizeof *kfds);
  560. for (i = 0; i < nfds; i++)
  561. {
  562. musl2dfs_events(&kfds[i].events);
  563. }
  564. ret = poll(kfds, nfds, timeout);
  565. if (ret > 0)
  566. {
  567. for (i = 0; i < nfds; i++)
  568. {
  569. dfs2musl_events(&kfds->revents);
  570. }
  571. lwp_put_to_user(fds, kfds, nfds * sizeof *kfds);
  572. }
  573. kmem_put(kfds);
  574. return ret;
  575. #else
  576. for (i = 0; i < nfds; i++)
  577. {
  578. musl2dfs_events(&fds->events);
  579. }
  580. ret = poll(fds, nfds, timeout);
  581. if (ret > 0)
  582. {
  583. for (i = 0; i < nfds; i++)
  584. {
  585. dfs2musl_events(&fds->revents);
  586. }
  587. }
  588. return ret;
  589. #endif
  590. }
  591. int sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
  592. {
  593. #ifdef RT_USING_USERSPACE
  594. int ret = -1;
  595. fd_set *kreadfds = RT_NULL, *kwritefds = RT_NULL, *kexceptfds = RT_NULL;
  596. if (readfds)
  597. {
  598. if (!lwp_user_accessable((void *)readfds, sizeof *readfds))
  599. {
  600. rt_set_errno(EINVAL);
  601. goto quit;
  602. }
  603. kreadfds = (fd_set *)kmem_get(sizeof *kreadfds);
  604. if (!kreadfds)
  605. {
  606. rt_set_errno(ENOMEM);
  607. goto quit;
  608. }
  609. lwp_get_from_user(kreadfds, readfds, sizeof *kreadfds);
  610. }
  611. if (writefds)
  612. {
  613. if (!lwp_user_accessable((void *)writefds, sizeof *writefds))
  614. {
  615. rt_set_errno(EINVAL);
  616. goto quit;
  617. }
  618. kwritefds = (fd_set *)kmem_get(sizeof *kwritefds);
  619. if (!kwritefds)
  620. {
  621. rt_set_errno(ENOMEM);
  622. goto quit;
  623. }
  624. lwp_get_from_user(kwritefds, writefds, sizeof *kwritefds);
  625. }
  626. if (exceptfds)
  627. {
  628. if (!lwp_user_accessable((void *)exceptfds, sizeof *exceptfds))
  629. {
  630. rt_set_errno(EINVAL);
  631. goto quit;
  632. }
  633. kexceptfds = (fd_set *)kmem_get(sizeof *kexceptfds);
  634. if (!kexceptfds)
  635. {
  636. rt_set_errno(EINVAL);
  637. goto quit;
  638. }
  639. lwp_get_from_user(kexceptfds, exceptfds, sizeof *kexceptfds);
  640. }
  641. ret = select(nfds, kreadfds, kwritefds, kexceptfds, timeout);
  642. if (kreadfds)
  643. {
  644. lwp_put_to_user(readfds, kreadfds, sizeof *kreadfds);
  645. }
  646. if (kwritefds)
  647. {
  648. lwp_put_to_user(writefds, kwritefds, sizeof *kwritefds);
  649. }
  650. if (kexceptfds)
  651. {
  652. lwp_put_to_user(exceptfds, kexceptfds, sizeof *kexceptfds);
  653. }
  654. quit:
  655. if (kreadfds)
  656. {
  657. kmem_put(kreadfds);
  658. }
  659. if (kwritefds)
  660. {
  661. kmem_put(kwritefds);
  662. }
  663. if (kexceptfds)
  664. {
  665. kmem_put(kexceptfds);
  666. }
  667. return ret;
  668. #else
  669. return select(nfds, readfds, writefds, exceptfds, timeout);
  670. #endif
  671. }
  672. int sys_unlink(const char *pathname)
  673. {
  674. #ifdef RT_USING_USERSPACE
  675. int ret = -1;
  676. rt_size_t len = 0;
  677. char *kname = RT_NULL;
  678. if (!lwp_user_accessable((void *)pathname, 1))
  679. {
  680. rt_set_errno(EINVAL);
  681. return -1;
  682. }
  683. len = rt_strlen(pathname);
  684. if (!len)
  685. {
  686. rt_set_errno(EINVAL);
  687. return -1;
  688. }
  689. kname = (char *)kmem_get(len + 1);
  690. if (!kname)
  691. {
  692. rt_set_errno(ENOMEM);
  693. return -1;
  694. }
  695. lwp_get_from_user(kname, (void *)pathname, len + 1);
  696. ret = unlink(kname);
  697. kmem_put(kname);
  698. return ret;
  699. #else
  700. return unlink(pathname);
  701. #endif
  702. }
  703. /* syscall: "nanosleep" ret: "int" args: "const struct timespec *" "struct timespec *" */
  704. int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
  705. {
  706. rt_tick_t tick;
  707. #ifdef RT_USING_USERSPACE
  708. struct timespec rqtp_k;
  709. struct timespec rmtp_k;
  710. dbg_log(DBG_LOG, "sys_nanosleep\n");
  711. if (!lwp_user_accessable((void *)rqtp, sizeof *rqtp))
  712. {
  713. rt_set_errno(EINVAL);
  714. return -1;
  715. }
  716. lwp_get_from_user(&rqtp_k, (void *)rqtp, sizeof rqtp_k);
  717. tick = rqtp_k.tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp_k.tv_nsec * RT_TICK_PER_SECOND) / 1000000000;
  718. rt_thread_delay(tick);
  719. if (rmtp)
  720. {
  721. if (!lwp_user_accessable((void *)rmtp, sizeof *rmtp))
  722. {
  723. rt_set_errno(EINVAL);
  724. return -1;
  725. }
  726. tick = rt_tick_get() - tick;
  727. /* get the passed time */
  728. rmtp_k.tv_sec = tick / RT_TICK_PER_SECOND;
  729. rmtp_k.tv_nsec = (tick % RT_TICK_PER_SECOND) * (1000000000 / RT_TICK_PER_SECOND);
  730. lwp_put_to_user(rmtp, (void *)&rmtp_k, sizeof rmtp_k);
  731. }
  732. #else
  733. dbg_log(DBG_LOG, "sys_nanosleep\n");
  734. tick = rqtp->tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp->tv_nsec * RT_TICK_PER_SECOND) / 1000000000;
  735. rt_thread_delay(tick);
  736. if (rmtp)
  737. {
  738. tick = rt_tick_get() - tick;
  739. /* get the passed time */
  740. rmtp->tv_sec = tick / RT_TICK_PER_SECOND;
  741. rmtp->tv_nsec = (tick % RT_TICK_PER_SECOND) * (1000000000 / RT_TICK_PER_SECOND);
  742. }
  743. #endif
  744. return 0;
  745. }
  746. /* syscall: "gettimeofday" ret: "int" args: "struct timeval *" "struct timezone *" */
  747. int sys_gettimeofday(struct timeval *tp, struct timezone *tzp)
  748. {
  749. struct timeval t_k;
  750. #ifdef RT_USING_USERSPACE
  751. if (tp)
  752. {
  753. if (!lwp_user_accessable((void *)tp, sizeof *tp))
  754. {
  755. rt_set_errno(EINVAL);
  756. return -1;
  757. }
  758. t_k.tv_sec = rt_tick_get() / RT_TICK_PER_SECOND;
  759. t_k.tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND);
  760. lwp_put_to_user(tp, (void *)&t_k, sizeof t_k);
  761. }
  762. #else
  763. if (tp)
  764. {
  765. tp->tv_sec = rt_tick_get() / RT_TICK_PER_SECOND;
  766. tp->tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND);
  767. }
  768. #endif
  769. return 0;
  770. }
  771. int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
  772. {
  773. return 0;
  774. }
  775. #ifdef RT_USING_GDBSERVER
  776. int lwp_execve(char *filename, int debug, int argc, char **argv, char **envp);
  777. #else
  778. int lwp_execve(char *filename, int argc, char **argv, char **envp);
  779. #endif
  780. int sys_exec(char *filename, int argc, char **argv, char **envp)
  781. {
  782. #ifdef RT_USING_GDBSERVER
  783. return lwp_execve(filename, 0, argc, argv, envp);
  784. #else
  785. return lwp_execve(filename, argc, argv, envp);
  786. #endif
  787. }
  788. int sys_kill(int pid, int sig)
  789. {
  790. return lwp_kill(pid, sig);
  791. }
  792. int sys_getpid(void)
  793. {
  794. return lwp_getpid();
  795. }
  796. /* syscall: "getpriority" ret: "int" args: "int" "id_t" */
  797. int sys_getpriority(int which, id_t who)
  798. {
  799. if (which == PRIO_PROCESS)
  800. {
  801. rt_thread_t tid;
  802. tid = rt_thread_self();
  803. if (who == (id_t)(rt_size_t)tid || who == 0xff)
  804. {
  805. return tid->current_priority;
  806. }
  807. }
  808. return 0xff;
  809. }
  810. /* syscall: "setpriority" ret: "int" args: "int" "id_t" "int" */
  811. int sys_setpriority(int which, id_t who, int prio)
  812. {
  813. if (which == PRIO_PROCESS)
  814. {
  815. rt_thread_t tid;
  816. tid = rt_thread_self();
  817. if ((who == (id_t)(rt_size_t)tid || who == 0xff) && (prio >= 0 && prio < RT_THREAD_PRIORITY_MAX))
  818. {
  819. rt_thread_control(tid, RT_THREAD_CTRL_CHANGE_PRIORITY, &prio);
  820. return 0;
  821. }
  822. }
  823. return -1;
  824. }
  825. rt_sem_t sys_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag)
  826. {
  827. return rt_sem_create(name, value, flag);
  828. }
  829. rt_err_t sys_sem_delete(rt_sem_t sem)
  830. {
  831. return rt_sem_delete(sem);
  832. }
  833. rt_err_t sys_sem_take(rt_sem_t sem, rt_int32_t time)
  834. {
  835. return rt_sem_take_interruptible(sem, time);
  836. }
  837. rt_err_t sys_sem_release(rt_sem_t sem)
  838. {
  839. return rt_sem_release(sem);
  840. }
  841. rt_mutex_t sys_mutex_create(const char *name, rt_uint8_t flag)
  842. {
  843. return rt_mutex_create(name, flag);
  844. }
  845. rt_err_t sys_mutex_delete(rt_mutex_t mutex)
  846. {
  847. return rt_mutex_delete(mutex);
  848. }
  849. rt_err_t sys_mutex_take(rt_mutex_t mutex, rt_int32_t time)
  850. {
  851. return rt_mutex_take_interruptible(mutex, time);
  852. }
  853. rt_err_t sys_mutex_release(rt_mutex_t mutex)
  854. {
  855. return rt_mutex_release(mutex);
  856. }
  857. #ifdef RT_USING_USERSPACE
  858. /* memory allocation */
  859. extern rt_base_t lwp_brk(void *addr);
  860. rt_base_t sys_brk(void *addr)
  861. {
  862. return lwp_brk(addr);
  863. }
  864. extern void *lwp_mmap2(void *addr, size_t length, int prot,
  865. int flags, int fd, off_t pgoffset);
  866. void *sys_mmap2(void *addr, size_t length, int prot,
  867. int flags, int fd, off_t pgoffset)
  868. {
  869. return lwp_mmap2(addr, length, prot, flags, fd, pgoffset);
  870. }
  871. extern int lwp_munmap(void *addr);
  872. int sys_munmap(void *addr, size_t length)
  873. {
  874. return lwp_munmap(addr);
  875. }
  876. #endif
  877. rt_event_t sys_event_create(const char *name, rt_uint8_t flag)
  878. {
  879. return rt_event_create(name, flag);
  880. }
  881. rt_err_t sys_event_delete(rt_event_t event)
  882. {
  883. return rt_event_delete(event);
  884. }
  885. rt_err_t sys_event_send(rt_event_t event, rt_uint32_t set)
  886. {
  887. return rt_event_send(event, set);
  888. }
  889. rt_err_t sys_event_recv(rt_event_t event,
  890. rt_uint32_t set,
  891. rt_uint8_t opt,
  892. rt_int32_t timeout,
  893. rt_uint32_t *recved)
  894. {
  895. return rt_event_recv(event, set, opt, timeout, recved);
  896. }
  897. rt_mailbox_t sys_mb_create(const char *name, rt_size_t size, rt_uint8_t flag)
  898. {
  899. return rt_mb_create(name, size, flag);
  900. }
  901. rt_err_t sys_mb_delete(rt_mailbox_t mb)
  902. {
  903. return rt_mb_delete(mb);
  904. }
  905. rt_err_t sys_mb_send(rt_mailbox_t mb, rt_uint32_t value)
  906. {
  907. return rt_mb_send(mb, value);
  908. }
  909. rt_err_t sys_mb_send_wait(rt_mailbox_t mb,
  910. rt_uint32_t value,
  911. rt_int32_t timeout)
  912. {
  913. return rt_mb_send_wait(mb, value, timeout);
  914. }
  915. rt_err_t sys_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout)
  916. {
  917. return rt_mb_recv(mb, (rt_ubase_t *)value, timeout);
  918. }
  919. rt_mq_t sys_mq_create(const char *name,
  920. rt_size_t msg_size,
  921. rt_size_t max_msgs,
  922. rt_uint8_t flag)
  923. {
  924. return rt_mq_create(name, msg_size, max_msgs, flag);
  925. }
  926. rt_err_t sys_mq_delete(rt_mq_t mq)
  927. {
  928. return rt_mq_delete(mq);
  929. }
  930. rt_err_t sys_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)
  931. {
  932. return rt_mq_send(mq, buffer, size);
  933. }
  934. rt_err_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size)
  935. {
  936. return rt_mq_urgent(mq, buffer, size);
  937. }
  938. rt_err_t sys_mq_recv(rt_mq_t mq,
  939. void *buffer,
  940. rt_size_t size,
  941. rt_int32_t timeout)
  942. {
  943. return rt_mq_recv(mq, buffer, size, timeout);
  944. }
  945. static void timer_timeout_callback(void *parameter)
  946. {
  947. rt_sem_t sem = (rt_sem_t)parameter;
  948. rt_sem_release(sem);
  949. }
  950. rt_timer_t sys_timer_create(const char *name,
  951. void *data,
  952. rt_tick_t time,
  953. rt_uint8_t flag)
  954. {
  955. return rt_timer_create(name, timer_timeout_callback, (void *)data, time, flag);
  956. }
  957. rt_err_t sys_timer_delete(rt_timer_t timer)
  958. {
  959. return rt_timer_delete(timer);
  960. }
  961. rt_err_t sys_timer_start(rt_timer_t timer)
  962. {
  963. return rt_timer_start(timer);
  964. }
  965. rt_err_t sys_timer_stop(rt_timer_t timer)
  966. {
  967. return rt_timer_stop(timer);
  968. }
  969. rt_err_t sys_timer_control(rt_timer_t timer, int cmd, void *arg)
  970. {
  971. return rt_timer_control(timer, cmd, arg);
  972. }
  973. rt_thread_t sys_thread_create(void *arg[])
  974. {
  975. rt_base_t level = 0;
  976. void *user_stack = 0;
  977. struct rt_lwp *lwp = 0;
  978. rt_thread_t thread = RT_NULL;
  979. int tid = 0;
  980. lwp = rt_thread_self()->lwp;
  981. lwp_ref_inc(lwp);
  982. #ifdef RT_USING_USERSPACE
  983. user_stack = lwp_map_user(lwp, 0, (size_t)arg[3], 0);
  984. #else
  985. user_stack = (void *)RT_KERNEL_MALLOC((uint32_t)arg[3]);
  986. #endif
  987. if (!user_stack)
  988. {
  989. rt_set_errno(EINVAL);
  990. goto fail;
  991. }
  992. if ((tid = lwp_tid_get()) == 0)
  993. {
  994. rt_set_errno(ENOMEM);
  995. goto fail;
  996. }
  997. thread = rt_thread_create((const char *)arg[0],
  998. lwp_user_thread,
  999. (void *)arg[2],
  1000. ALLOC_KERNEL_STACK_SIZE,
  1001. (rt_uint8_t)(size_t)arg[4],
  1002. (rt_uint32_t)(rt_size_t)arg[5]);
  1003. if (!thread)
  1004. {
  1005. goto fail;
  1006. }
  1007. thread->cleanup = lwp_cleanup;
  1008. thread->user_entry = (void (*)(void *))arg[1];
  1009. thread->user_stack = (void *)user_stack;
  1010. thread->user_stack_size = (rt_size_t)arg[3];
  1011. thread->lwp = (void*)lwp;
  1012. thread->tid = tid;
  1013. lwp_tid_set_thread(tid, thread);
  1014. level = rt_hw_interrupt_disable();
  1015. rt_list_insert_after(&lwp->t_grp, &thread->sibling);
  1016. rt_hw_interrupt_enable(level);
  1017. return thread;
  1018. fail:
  1019. lwp_tid_put(tid);
  1020. #ifndef RT_USING_USERSPACE
  1021. if (user_stack)
  1022. {
  1023. RT_KERNEL_FREE(user_stack);
  1024. }
  1025. #endif
  1026. if (lwp)
  1027. {
  1028. lwp_ref_dec(lwp);
  1029. }
  1030. return RT_NULL;
  1031. }
  1032. #define CLONE_VM 0x00000100
  1033. #define CLONE_FS 0x00000200
  1034. #define CLONE_FILES 0x00000400
  1035. #define CLONE_SIGHAND 0x00000800
  1036. #define CLONE_PTRACE 0x00002000
  1037. #define CLONE_VFORK 0x00004000
  1038. #define CLONE_PARENT 0x00008000
  1039. #define CLONE_THREAD 0x00010000
  1040. #define CLONE_NEWNS 0x00020000
  1041. #define CLONE_SYSVSEM 0x00040000
  1042. #define CLONE_SETTLS 0x00080000
  1043. #define CLONE_PARENT_SETTID 0x00100000
  1044. #define CLONE_CHILD_CLEARTID 0x00200000
  1045. #define CLONE_DETACHED 0x00400000
  1046. #define CLONE_UNTRACED 0x00800000
  1047. #define CLONE_CHILD_SETTID 0x01000000
  1048. #define CLONE_NEWCGROUP 0x02000000
  1049. #define CLONE_NEWUTS 0x04000000
  1050. #define CLONE_NEWIPC 0x08000000
  1051. #define CLONE_NEWUSER 0x10000000
  1052. #define CLONE_NEWPID 0x20000000
  1053. #define CLONE_NEWNET 0x40000000
  1054. #define CLONE_IO 0x80000000
  1055. /* arg[] -> flags
  1056. * stack
  1057. * new_tid
  1058. * tls
  1059. * set_clear_tid_address
  1060. * quit_func
  1061. * start_args
  1062. * */
  1063. #define SYS_CLONE_ARGS_NR 7
  1064. int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack,
  1065. void *user_stack, void **thread_sp, int tid);
  1066. long sys_clone(void *arg[])
  1067. {
  1068. rt_base_t level = 0;
  1069. struct rt_lwp *lwp = 0;
  1070. rt_thread_t thread = RT_NULL;
  1071. rt_thread_t self = RT_NULL;
  1072. int tid = 0;
  1073. unsigned long flags = 0;
  1074. void *user_stack = RT_NULL;
  1075. int *new_tid = RT_NULL;
  1076. void *tls = RT_NULL;
  1077. /*
  1078. musl call flags (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND
  1079. | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS
  1080. | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED);
  1081. */
  1082. /* check args */
  1083. if (!lwp_user_accessable(arg, sizeof(void *[SYS_CLONE_ARGS_NR])))
  1084. {
  1085. rt_set_errno(EINVAL);
  1086. return -1;
  1087. }
  1088. flags = (unsigned long)(size_t)arg[0];
  1089. if ((flags & (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_THREAD | CLONE_SYSVSEM))
  1090. != (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_THREAD | CLONE_SYSVSEM))
  1091. {
  1092. rt_set_errno(EINVAL);
  1093. return -1;
  1094. }
  1095. user_stack = arg[1];
  1096. new_tid = (int *)arg[2];
  1097. tls = (void *)arg[3];
  1098. if ((flags & CLONE_PARENT_SETTID) == CLONE_PARENT_SETTID)
  1099. {
  1100. if (!lwp_user_accessable(new_tid, sizeof(int)))
  1101. {
  1102. rt_set_errno(EINVAL);
  1103. return -1;
  1104. }
  1105. }
  1106. self = rt_thread_self();
  1107. lwp = self->lwp;
  1108. lwp_ref_inc(lwp);
  1109. if (!user_stack)
  1110. {
  1111. rt_set_errno(EINVAL);
  1112. goto fail;
  1113. }
  1114. if ((tid = lwp_tid_get()) == 0)
  1115. {
  1116. rt_set_errno(ENOMEM);
  1117. goto fail;
  1118. }
  1119. thread = rt_thread_create((const char *)"pthread",
  1120. RT_NULL,
  1121. RT_NULL,
  1122. self->stack_size,
  1123. self->init_priority,
  1124. self->init_tick);
  1125. if (!thread)
  1126. {
  1127. goto fail;
  1128. }
  1129. thread->cleanup = lwp_cleanup;
  1130. thread->user_entry = RT_NULL;
  1131. thread->user_stack = RT_NULL;
  1132. thread->user_stack_size = 0;
  1133. thread->lwp = (void *)lwp;
  1134. thread->tid = tid;
  1135. if ((flags & CLONE_SETTLS) == CLONE_SETTLS)
  1136. {
  1137. thread->thread_idr = tls;
  1138. }
  1139. if ((flags & CLONE_PARENT_SETTID) == CLONE_PARENT_SETTID)
  1140. {
  1141. *new_tid = (int)(tid);
  1142. }
  1143. if ((flags & CLONE_CHILD_CLEARTID) == CLONE_CHILD_CLEARTID)
  1144. {
  1145. thread->clear_child_tid = (int *)arg[4];
  1146. }
  1147. level = rt_hw_interrupt_disable();
  1148. rt_list_insert_after(&lwp->t_grp, &thread->sibling);
  1149. rt_hw_interrupt_enable(level);
  1150. /* copy origin stack */
  1151. rt_memcpy(thread->stack_addr, self->stack_addr, ALLOC_KERNEL_STACK_SIZE);
  1152. lwp_tid_set_thread(tid, thread);
  1153. tid = lwp_set_thread_context((void *)((char *)thread->stack_addr + ALLOC_KERNEL_STACK_SIZE),
  1154. (void *)((char *)self->stack_addr + ALLOC_KERNEL_STACK_SIZE), user_stack, &thread->sp, tid);
  1155. if (tid)
  1156. {
  1157. rt_thread_startup(thread);
  1158. }
  1159. return (long)tid;
  1160. fail:
  1161. lwp_tid_put(tid);
  1162. if (lwp)
  1163. {
  1164. lwp_ref_dec(lwp);
  1165. }
  1166. return -1;
  1167. }
  1168. int lwp_dup_user(struct lwp_avl_struct* ptree, void *arg);
  1169. void *lwp_get_user_sp(void);
  1170. static int _copy_process(struct rt_lwp *dest_lwp, struct rt_lwp *src_lwp)
  1171. {
  1172. return lwp_avl_traversal(src_lwp->map_area, lwp_dup_user, dest_lwp);
  1173. }
  1174. static void lwp_struct_copy(struct rt_lwp *dst, struct rt_lwp *src)
  1175. {
  1176. #ifdef RT_USING_USERSPACE
  1177. dst->end_heap = src->end_heap;
  1178. #endif
  1179. dst->lwp_type = src->lwp_type;
  1180. dst->text_entry = src->text_entry;
  1181. dst->text_size = src->text_size;
  1182. dst->data_entry = src->data_entry;
  1183. dst->data_size = src->data_size;
  1184. dst->args = src->args;
  1185. rt_memcpy(dst->cmd, src->cmd, RT_NAME_MAX);
  1186. dst->signal_mask = src->signal_mask;
  1187. rt_memcpy(dst->signal_handler, src->signal_handler, sizeof dst->signal_handler);
  1188. }
  1189. static int lwp_copy_files(struct rt_lwp *dst, struct rt_lwp *src)
  1190. {
  1191. struct dfs_fdtable *dst_fdt;
  1192. struct dfs_fdtable *src_fdt;
  1193. src_fdt = &src->fdt;
  1194. dst_fdt = &dst->fdt;
  1195. /* init fds */
  1196. dst_fdt->fds = rt_calloc(src_fdt->maxfd, sizeof(void *));
  1197. if (dst_fdt->fds)
  1198. {
  1199. struct dfs_fd *d_s;
  1200. struct dfs_fd *d_d;
  1201. int i;
  1202. dst_fdt->maxfd = src_fdt->maxfd;
  1203. dfs_fd_lock();
  1204. /* copy stdio */
  1205. for (i = 0; i < src_fdt->maxfd; i++)
  1206. {
  1207. d_s = fdt_fd_get(src_fdt, i);
  1208. if (d_s)
  1209. {
  1210. dfs_fm_lock();
  1211. if (!d_s->fnode)
  1212. {
  1213. dfs_fm_unlock();
  1214. continue;
  1215. }
  1216. d_s->fnode->ref_count++;
  1217. dfs_fm_unlock();
  1218. /* alloc dfs_fd struct */
  1219. d_d = (struct dfs_fd *)rt_calloc(1, sizeof(struct dfs_fd));
  1220. if (!d_d)
  1221. {
  1222. dfs_fd_unlock();
  1223. return -1;
  1224. }
  1225. dst_fdt->fds[i] = d_d;
  1226. d_d->magic = d_s->magic;
  1227. d_d->ref_count = 1;
  1228. d_d->pos = d_s->pos;
  1229. d_d->fnode = d_s->fnode;
  1230. d_d->data = d_s->data;
  1231. }
  1232. }
  1233. dfs_fd_unlock();
  1234. return 0;
  1235. }
  1236. return -1;
  1237. }
  1238. int sys_fork(void)
  1239. {
  1240. rt_base_t level;
  1241. int tid = 0;
  1242. struct rt_lwp *lwp = RT_NULL;
  1243. struct rt_lwp *self_lwp = RT_NULL;
  1244. rt_thread_t thread = RT_NULL;
  1245. rt_thread_t self_thread = RT_NULL;
  1246. void *user_stack = RT_NULL;
  1247. char thread_name[RT_NAME_MAX + 1];
  1248. /* new lwp */
  1249. lwp = lwp_new();
  1250. if (!lwp)
  1251. {
  1252. rt_set_errno(ENOMEM);
  1253. goto fail;
  1254. }
  1255. /* new tid */
  1256. if ((tid = lwp_tid_get()) == 0)
  1257. {
  1258. rt_set_errno(ENOMEM);
  1259. goto fail;
  1260. }
  1261. /* user space init */
  1262. if (lwp_user_space_init(lwp) != 0)
  1263. {
  1264. rt_set_errno(ENOMEM);
  1265. goto fail;
  1266. }
  1267. self_lwp = lwp_self();
  1268. /* copy process */
  1269. if (_copy_process(lwp, self_lwp) != 0)
  1270. {
  1271. rt_set_errno(ENOMEM);
  1272. goto fail;
  1273. }
  1274. /* copy lwp struct data */
  1275. lwp_struct_copy(lwp, self_lwp);
  1276. /* copy files */
  1277. if (lwp_copy_files(lwp, self_lwp) != 0)
  1278. {
  1279. rt_set_errno(ENOMEM);
  1280. goto fail;
  1281. }
  1282. /* create thread */
  1283. self_thread = rt_thread_self();
  1284. rt_memcpy(thread_name, self_thread->name, RT_NAME_MAX);
  1285. thread_name[RT_NAME_MAX] = '\0';
  1286. thread = rt_thread_create((const char *)thread_name,
  1287. RT_NULL,
  1288. RT_NULL,
  1289. self_thread->stack_size,
  1290. self_thread->init_priority,
  1291. self_thread->init_tick);
  1292. if (!thread)
  1293. {
  1294. goto fail;
  1295. }
  1296. thread->cleanup = self_thread->cleanup;
  1297. thread->user_entry = self_thread->user_entry;
  1298. thread->user_stack = self_thread->user_stack;
  1299. thread->user_stack_size = self_thread->user_stack_size;
  1300. thread->signal_mask = self_thread->signal_mask;
  1301. thread->thread_idr = self_thread->thread_idr;
  1302. thread->lwp = (void *)lwp;
  1303. thread->tid = tid;
  1304. level = rt_hw_interrupt_disable();
  1305. /* add thread to lwp process */
  1306. rt_list_insert_after(&lwp->t_grp, &thread->sibling);
  1307. /* lwp add to children link */
  1308. lwp->sibling = self_lwp->first_child;
  1309. self_lwp->first_child = lwp;
  1310. lwp->parent = self_lwp;
  1311. rt_hw_interrupt_enable(level);
  1312. /* copy origin stack */
  1313. rt_memcpy(thread->stack_addr, self_thread->stack_addr, self_thread->stack_size);
  1314. lwp_tid_set_thread(tid, thread);
  1315. level = rt_hw_interrupt_disable();
  1316. user_stack = lwp_get_user_sp();
  1317. rt_hw_interrupt_enable(level);
  1318. tid = lwp_set_thread_context((void *)((char *)thread->stack_addr + thread->stack_size),
  1319. (void *)((char *)self_thread->stack_addr + self_thread->stack_size), user_stack, &thread->sp, tid);
  1320. if (tid)
  1321. {
  1322. level = rt_hw_interrupt_disable();
  1323. if (rt_console_get_foreground() == self_lwp)
  1324. {
  1325. rt_console_set_foreground(lwp);
  1326. }
  1327. rt_hw_interrupt_enable(level);
  1328. rt_thread_startup(thread);
  1329. return lwp_to_pid(lwp);
  1330. }
  1331. else
  1332. {
  1333. return 0;
  1334. }
  1335. fail:
  1336. if (tid != 0)
  1337. {
  1338. lwp_tid_put(tid);
  1339. }
  1340. if (lwp)
  1341. {
  1342. lwp_ref_dec(lwp);
  1343. }
  1344. return -1;
  1345. }
  1346. rt_err_t sys_thread_delete(rt_thread_t thread)
  1347. {
  1348. return rt_thread_delete(thread);
  1349. }
  1350. rt_err_t sys_thread_startup(rt_thread_t thread)
  1351. {
  1352. return rt_thread_startup(thread);
  1353. }
  1354. rt_thread_t sys_thread_self(void)
  1355. {
  1356. return rt_thread_self();
  1357. }
  1358. /* sys channel */
  1359. int sys_channel_open(const char *name, int flags)
  1360. {
  1361. return lwp_channel_open(FDT_TYPE_LWP, name, flags);
  1362. }
  1363. rt_err_t sys_channel_close(int fd)
  1364. {
  1365. return lwp_channel_close(FDT_TYPE_LWP, fd);
  1366. }
  1367. rt_err_t sys_channel_send(int fd, rt_channel_msg_t data)
  1368. {
  1369. return lwp_channel_send(FDT_TYPE_LWP, fd, data);
  1370. }
  1371. rt_err_t sys_channel_send_recv_timeout(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time)
  1372. {
  1373. return lwp_channel_send_recv_timeout(FDT_TYPE_LWP, fd, data, data_ret, time);
  1374. }
  1375. rt_err_t sys_channel_reply(int fd, rt_channel_msg_t data)
  1376. {
  1377. return lwp_channel_reply(FDT_TYPE_LWP, fd, data);
  1378. }
  1379. rt_err_t sys_channel_recv_timeout(int fd, rt_channel_msg_t data, rt_int32_t time)
  1380. {
  1381. return lwp_channel_recv_timeout(FDT_TYPE_LWP, fd, data, time);
  1382. }
  1383. /*****/
  1384. static struct rt_semaphore critical_lock;
  1385. static int critical_init(void)
  1386. {
  1387. rt_sem_init(&critical_lock, "ct_lock", 1, RT_IPC_FLAG_FIFO);
  1388. return 0;
  1389. }
  1390. INIT_DEVICE_EXPORT(critical_init);
  1391. void sys_enter_critical(void)
  1392. {
  1393. rt_sem_take(&critical_lock, RT_WAITING_FOREVER);
  1394. }
  1395. void sys_exit_critical(void)
  1396. {
  1397. rt_sem_release(&critical_lock);
  1398. }
  1399. /* syscall: "sys_log" ret: "int" args: "const char*" "size" */
  1400. static int __sys_log_enable = 0;
  1401. static int sys_log_enable(int argc, char** argv)
  1402. {
  1403. if (argc == 1)
  1404. {
  1405. rt_kprintf("sys_log = %d\n", __sys_log_enable);
  1406. return 0;
  1407. }
  1408. else
  1409. {
  1410. __sys_log_enable = atoi(argv[1]);
  1411. }
  1412. return 0;
  1413. }
  1414. MSH_CMD_EXPORT_ALIAS(sys_log_enable, sys_log, sys_log 1(enable)/0(disable));
  1415. int sys_log(const char* log, int size)
  1416. {
  1417. rt_device_t console = rt_console_get_device();
  1418. if (console && __sys_log_enable)
  1419. {
  1420. rt_device_write(console, -1, log, size);
  1421. }
  1422. return 0;
  1423. }
  1424. int sys_stat(const char *file, struct stat *buf)
  1425. {
  1426. return stat(file, buf);
  1427. }
  1428. int sys_notimpl(void)
  1429. {
  1430. rt_set_errno(ENOSYS);
  1431. return -ENOSYS;
  1432. }
  1433. uint32_t sys_hw_interrupt_disable(void)
  1434. {
  1435. return rt_hw_interrupt_disable();
  1436. }
  1437. void sys_hw_interrupt_enable(uint32_t level)
  1438. {
  1439. rt_hw_interrupt_enable(level);
  1440. }
  1441. #ifdef RT_USING_USERSPACE
  1442. int sys_shmget(size_t key, size_t size, int create)
  1443. {
  1444. return lwp_shmget(key, size, create);
  1445. }
  1446. int sys_shmrm(int id)
  1447. {
  1448. return lwp_shmrm(id);
  1449. }
  1450. void* sys_shmat(int id, void* shm_vaddr)
  1451. {
  1452. return lwp_shmat(id, shm_vaddr);
  1453. }
  1454. int sys_shmdt(void* shm_vaddr)
  1455. {
  1456. return lwp_shmdt(shm_vaddr);
  1457. }
  1458. #endif
  1459. /* device interfaces */
  1460. rt_err_t sys_device_init(rt_device_t dev)
  1461. {
  1462. return rt_device_init(dev);
  1463. }
  1464. rt_err_t sys_device_register(rt_device_t dev, const char *name, rt_uint16_t flags)
  1465. {
  1466. return rt_device_register(dev, name, flags);
  1467. }
  1468. rt_err_t sys_device_control(rt_device_t dev, int cmd, void *arg)
  1469. {
  1470. return rt_device_control(dev, cmd, arg);
  1471. }
  1472. rt_device_t sys_device_find(const char* name)
  1473. {
  1474. return rt_device_find(name);
  1475. }
  1476. rt_err_t sys_device_open(rt_device_t dev, rt_uint16_t oflag)
  1477. {
  1478. return rt_device_open(dev, oflag);
  1479. }
  1480. rt_err_t sys_device_close(rt_device_t dev)
  1481. {
  1482. return rt_device_close(dev);
  1483. }
  1484. rt_size_t sys_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
  1485. {
  1486. return rt_device_read(dev, pos, buffer, size);
  1487. }
  1488. rt_size_t sys_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
  1489. {
  1490. return rt_device_write(dev, pos, buffer, size);
  1491. }
  1492. #ifdef RT_USING_SAL
  1493. /* network interfaces */
  1494. int sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
  1495. {
  1496. int ret = -1;
  1497. struct sockaddr ksa;
  1498. struct musl_sockaddr kmusladdr;
  1499. socklen_t uaddrlen;
  1500. socklen_t kaddrlen;
  1501. if (addr)
  1502. {
  1503. if (!lwp_user_accessable(addrlen, sizeof (socklen_t *)))
  1504. {
  1505. rt_set_errno(EINVAL);
  1506. return -1;
  1507. }
  1508. lwp_get_from_user(&uaddrlen, addrlen, sizeof (socklen_t *));
  1509. if (!uaddrlen)
  1510. {
  1511. rt_set_errno(EINVAL);
  1512. return -1;
  1513. }
  1514. if (!lwp_user_accessable(addr, uaddrlen))
  1515. {
  1516. rt_set_errno(EINVAL);
  1517. return -1;
  1518. }
  1519. }
  1520. kaddrlen = sizeof(struct sockaddr);
  1521. ret = accept(socket, &ksa, &kaddrlen);
  1522. if (ret >= 0)
  1523. {
  1524. if (addr)
  1525. {
  1526. sockaddr_tomusl(&ksa, &kmusladdr);
  1527. if (uaddrlen > sizeof(struct musl_sockaddr))
  1528. {
  1529. uaddrlen = sizeof(struct musl_sockaddr);
  1530. }
  1531. lwp_put_to_user(addr, &kmusladdr, uaddrlen);
  1532. lwp_put_to_user(addrlen, &uaddrlen, sizeof (socklen_t *));
  1533. }
  1534. }
  1535. return ret;
  1536. }
  1537. int sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namelen)
  1538. {
  1539. struct sockaddr sa;
  1540. struct musl_sockaddr kname;
  1541. if (!lwp_user_accessable((void *)name, namelen))
  1542. {
  1543. rt_set_errno(EINVAL);
  1544. return -1;
  1545. }
  1546. lwp_get_from_user(&kname, (void *)name, namelen);
  1547. sockaddr_tolwip(&kname, &sa);
  1548. return bind(socket, &sa, namelen);
  1549. }
  1550. int sys_shutdown(int socket, int how)
  1551. {
  1552. return shutdown(socket, how);
  1553. }
  1554. int sys_getpeername (int socket, struct musl_sockaddr *name, socklen_t *namelen)
  1555. {
  1556. int ret = -1;
  1557. struct sockaddr sa;
  1558. struct musl_sockaddr kname;
  1559. socklen_t unamelen;
  1560. socklen_t knamelen;
  1561. if (!lwp_user_accessable(namelen, sizeof (socklen_t *)))
  1562. {
  1563. rt_set_errno(EINVAL);
  1564. return -1;
  1565. }
  1566. lwp_get_from_user(&unamelen, namelen, sizeof (socklen_t *));
  1567. if (!unamelen)
  1568. {
  1569. rt_set_errno(EINVAL);
  1570. return -1;
  1571. }
  1572. if (!lwp_user_accessable(name, unamelen))
  1573. {
  1574. rt_set_errno(EINVAL);
  1575. return -1;
  1576. }
  1577. knamelen = sizeof(struct sockaddr);
  1578. ret = getpeername(socket, &sa, &knamelen);
  1579. if (ret == 0)
  1580. {
  1581. sockaddr_tomusl(&sa, &kname);
  1582. if (unamelen > sizeof(struct musl_sockaddr))
  1583. {
  1584. unamelen = sizeof(struct musl_sockaddr);
  1585. }
  1586. lwp_put_to_user(name, &kname, unamelen);
  1587. lwp_put_to_user(namelen, &unamelen, sizeof (socklen_t *));
  1588. }
  1589. return ret;
  1590. }
  1591. int sys_getsockname (int socket, struct musl_sockaddr *name, socklen_t *namelen)
  1592. {
  1593. int ret = -1;
  1594. struct sockaddr sa;
  1595. struct musl_sockaddr kname;
  1596. socklen_t unamelen;
  1597. socklen_t knamelen;
  1598. if (!lwp_user_accessable(namelen, sizeof (socklen_t *)))
  1599. {
  1600. rt_set_errno(EINVAL);
  1601. return -1;
  1602. }
  1603. lwp_get_from_user(&unamelen, namelen, sizeof (socklen_t *));
  1604. if (!unamelen)
  1605. {
  1606. rt_set_errno(EINVAL);
  1607. return -1;
  1608. }
  1609. if (!lwp_user_accessable(name, unamelen))
  1610. {
  1611. rt_set_errno(EINVAL);
  1612. return -1;
  1613. }
  1614. knamelen = sizeof(struct sockaddr);
  1615. ret = getsockname(socket, &sa, &knamelen);
  1616. if (ret == 0)
  1617. {
  1618. sockaddr_tomusl(&sa, &kname);
  1619. if (unamelen > sizeof(struct musl_sockaddr))
  1620. {
  1621. unamelen = sizeof(struct musl_sockaddr);
  1622. }
  1623. lwp_put_to_user(name, &kname, unamelen);
  1624. lwp_put_to_user(namelen, &unamelen, sizeof(socklen_t *));
  1625. }
  1626. return ret;
  1627. }
  1628. int sys_getsockopt(int socket, int level, int optname, void *optval, socklen_t *optlen)
  1629. {
  1630. convert_sockopt(&level, &optname);
  1631. return getsockopt(socket, level, optname, optval, optlen);
  1632. }
  1633. int sys_setsockopt(int socket, int level, int optname, const void *optval, socklen_t optlen)
  1634. {
  1635. convert_sockopt(&level, &optname);
  1636. return setsockopt(socket, level, optname, optval, optlen);
  1637. }
  1638. int sys_connect(int socket, const struct musl_sockaddr *name, socklen_t namelen)
  1639. {
  1640. struct sockaddr sa;
  1641. struct musl_sockaddr kname;
  1642. if (!lwp_user_accessable((void *)name, namelen))
  1643. {
  1644. rt_set_errno(EINVAL);
  1645. return -1;
  1646. }
  1647. lwp_get_from_user(&kname, (void *)name, namelen);
  1648. sockaddr_tolwip(&kname, &sa);
  1649. return connect(socket, &sa, namelen);
  1650. }
  1651. int sys_listen(int socket, int backlog)
  1652. {
  1653. return listen(socket, backlog);
  1654. }
  1655. #define MUSLC_MSG_OOB 0x0001
  1656. #define MUSLC_MSG_PEEK 0x0002
  1657. #define MUSLC_MSG_DONTWAIT 0x0040
  1658. #define MUSLC_MSG_WAITALL 0x0100
  1659. #define MUSLC_MSG_MORE 0x8000
  1660. static int netflags_muslc_2_lwip(int flags)
  1661. {
  1662. int flgs = 0;
  1663. if (flags & MUSLC_MSG_PEEK)
  1664. {
  1665. flgs |= MSG_PEEK;
  1666. }
  1667. if (flags & MUSLC_MSG_WAITALL)
  1668. {
  1669. flgs |= MSG_WAITALL;
  1670. }
  1671. if (flags & MUSLC_MSG_OOB)
  1672. {
  1673. flgs |= MSG_OOB;
  1674. }
  1675. if (flags & MUSLC_MSG_DONTWAIT)
  1676. {
  1677. flgs |= MSG_DONTWAIT;
  1678. }
  1679. if (flags & MUSLC_MSG_MORE)
  1680. {
  1681. flgs |= MSG_MORE;
  1682. }
  1683. return flgs;
  1684. }
  1685. int sys_recvfrom(int socket, void *mem, size_t len, int flags,
  1686. struct musl_sockaddr *from, socklen_t *fromlen)
  1687. {
  1688. int flgs = 0;
  1689. #ifdef RT_USING_USERSPACE
  1690. int ret = -1;
  1691. void *kmem = RT_NULL;
  1692. #endif
  1693. flgs = netflags_muslc_2_lwip(flags);
  1694. #ifdef RT_USING_USERSPACE
  1695. if (!len)
  1696. {
  1697. rt_set_errno(EINVAL);
  1698. return -1;
  1699. }
  1700. if (!lwp_user_accessable((void *)mem, len))
  1701. {
  1702. rt_set_errno(EINVAL);
  1703. return -1;
  1704. }
  1705. kmem = kmem_get(len);
  1706. if (!kmem)
  1707. {
  1708. rt_set_errno(ENOMEM);
  1709. return -1;
  1710. }
  1711. if (flags == 0x2)
  1712. {
  1713. flags = 0x1;
  1714. }
  1715. if (from)
  1716. {
  1717. struct sockaddr sa;
  1718. ret = recvfrom(socket, kmem, len, flgs, &sa, fromlen);
  1719. sockaddr_tomusl(&sa, from);
  1720. }
  1721. else
  1722. {
  1723. ret = recvfrom(socket, kmem, len, flgs, NULL, NULL);
  1724. }
  1725. if (ret > 0)
  1726. {
  1727. lwp_put_to_user(mem, kmem, len);
  1728. }
  1729. kmem_put(kmem);
  1730. return ret;
  1731. #else
  1732. if (from)
  1733. {
  1734. int ret = -1;
  1735. struct sockaddr sa = {0};
  1736. ret = recvfrom(socket, mem, len, flgs, &sa, fromlen);
  1737. sockaddr_tomusl(&sa, from);
  1738. return ret;
  1739. }
  1740. return recvfrom(socket, mem, len, flags, NULL, NULL);
  1741. #endif
  1742. }
  1743. int sys_recv(int socket, void *mem, size_t len, int flags)
  1744. {
  1745. int flgs = 0;
  1746. flgs = netflags_muslc_2_lwip(flags);
  1747. return recvfrom(socket, mem, len, flgs, NULL, NULL);
  1748. }
  1749. int sys_sendto(int socket, const void *dataptr, size_t size, int flags,
  1750. const struct musl_sockaddr *to, socklen_t tolen)
  1751. {
  1752. int flgs = 0;
  1753. #ifdef RT_USING_USERSPACE
  1754. int ret = -1;
  1755. void *kmem = RT_NULL;
  1756. #endif
  1757. flgs = netflags_muslc_2_lwip(flags);
  1758. #ifdef RT_USING_USERSPACE
  1759. if (!size)
  1760. {
  1761. rt_set_errno(EINVAL);
  1762. return -1;
  1763. }
  1764. if (!lwp_user_accessable((void *)dataptr, size))
  1765. {
  1766. rt_set_errno(EINVAL);
  1767. return -1;
  1768. }
  1769. kmem = kmem_get(size);
  1770. if (!kmem)
  1771. {
  1772. rt_set_errno(ENOMEM);
  1773. return -1;
  1774. }
  1775. lwp_get_from_user(kmem, (void *)dataptr, size);
  1776. if (to)
  1777. {
  1778. struct sockaddr sa;
  1779. sockaddr_tolwip(to, &sa);
  1780. ret = sendto(socket, kmem, size, flgs, &sa, tolen);
  1781. }
  1782. else
  1783. {
  1784. ret = sendto(socket, kmem, size, flgs, NULL, tolen);
  1785. }
  1786. kmem_put(kmem);
  1787. return ret;
  1788. #else
  1789. if (to)
  1790. {
  1791. struct sockaddr sa;
  1792. sockaddr_tolwip(to, &sa);
  1793. return sendto(socket, dataptr, size, flgs, &sa, tolen);
  1794. }
  1795. return sendto(socket, dataptr, size, flgs, NULL, tolen);
  1796. #endif
  1797. }
  1798. int sys_send(int socket, const void *dataptr, size_t size, int flags)
  1799. {
  1800. int flgs = 0;
  1801. flgs = netflags_muslc_2_lwip(flags);
  1802. return sendto(socket, dataptr, size, flgs, NULL, 0);
  1803. }
  1804. int sys_socket(int domain, int type, int protocol)
  1805. {
  1806. int fd = -1;
  1807. int nonblock = 0;
  1808. /* not support SOCK_CLOEXEC type */
  1809. if (type & SOCK_CLOEXEC)
  1810. {
  1811. type &= ~SOCK_CLOEXEC;
  1812. }
  1813. if (type & SOCK_NONBLOCK)
  1814. {
  1815. nonblock = 1;
  1816. type &= ~SOCK_NONBLOCK;
  1817. }
  1818. fd = socket(domain, type, protocol);
  1819. if (fd < 0)
  1820. {
  1821. goto out;
  1822. }
  1823. if (nonblock)
  1824. {
  1825. fcntl(fd, F_SETFL, O_NONBLOCK);
  1826. }
  1827. out:
  1828. return fd;
  1829. }
  1830. int sys_closesocket(int socket)
  1831. {
  1832. return closesocket(socket);
  1833. }
  1834. #endif
  1835. rt_thread_t sys_thread_find(char *name)
  1836. {
  1837. return rt_thread_find(name);
  1838. }
  1839. rt_tick_t sys_tick_get(void)
  1840. {
  1841. return rt_tick_get();
  1842. }
  1843. rt_err_t sys_thread_mdelay(rt_int32_t ms)
  1844. {
  1845. return rt_thread_mdelay(ms);
  1846. }
  1847. int sys_sigaction(int sig, const struct sigaction *act,
  1848. struct sigaction *oact, size_t sigsetsize)
  1849. {
  1850. int ret = -RT_EINVAL;
  1851. struct lwp_sigaction kact, *pkact = RT_NULL;
  1852. struct lwp_sigaction koact, *pkoact = RT_NULL;
  1853. if (!sigsetsize)
  1854. {
  1855. rt_set_errno(EINVAL);
  1856. goto out;
  1857. }
  1858. if (sigsetsize > sizeof(lwp_sigset_t))
  1859. {
  1860. sigsetsize = sizeof(lwp_sigset_t);
  1861. }
  1862. if (!act && !oact)
  1863. {
  1864. rt_set_errno(EINVAL);
  1865. goto out;
  1866. }
  1867. if (oact)
  1868. {
  1869. if (!lwp_user_accessable((void *)oact, sigsetsize))
  1870. {
  1871. rt_set_errno(EINVAL);
  1872. goto out;
  1873. }
  1874. pkoact = &koact;
  1875. }
  1876. if (act)
  1877. {
  1878. if (!lwp_user_accessable((void *)act, sigsetsize))
  1879. {
  1880. rt_set_errno(EINVAL);
  1881. goto out;
  1882. }
  1883. kact.__sa_handler._sa_handler = act->sa_handler;
  1884. memcpy(&kact.sa_mask, &act->sa_mask, sigsetsize);
  1885. pkact = &kact;
  1886. }
  1887. ret = lwp_sigaction(sig, pkact, pkoact, sigsetsize);
  1888. if (ret == 0)
  1889. {
  1890. lwp_put_to_user(&oact->sa_handler, &pkoact->__sa_handler._sa_handler, sizeof(void (*)(int)));
  1891. lwp_put_to_user(&oact->sa_mask, &pkoact->sa_mask, sigsetsize);
  1892. lwp_put_to_user(&oact->sa_flags, &pkoact->sa_flags, sizeof(int));
  1893. lwp_put_to_user(&oact->sa_restorer, &pkoact->sa_restorer, sizeof(void (*)(void)));
  1894. }
  1895. out:
  1896. return ret;
  1897. }
  1898. int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size)
  1899. {
  1900. int ret = -1;
  1901. lwp_sigset_t newset, *pnewset = RT_NULL;
  1902. lwp_sigset_t oldset, *poldset = RT_NULL;
  1903. if (!size)
  1904. {
  1905. rt_set_errno(EINVAL);
  1906. return ret;
  1907. }
  1908. if (!oset && !sigset)
  1909. {
  1910. rt_set_errno(EINVAL);
  1911. return ret;
  1912. }
  1913. if (size > sizeof(lwp_sigset_t))
  1914. {
  1915. size = sizeof(lwp_sigset_t);
  1916. }
  1917. if (oset)
  1918. {
  1919. if (!lwp_user_accessable((void *)oset, size))
  1920. {
  1921. rt_set_errno(EINVAL);
  1922. return ret;
  1923. }
  1924. poldset = &oldset;
  1925. }
  1926. if (sigset)
  1927. {
  1928. if (!lwp_user_accessable((void *)sigset, size))
  1929. {
  1930. rt_set_errno(EINVAL);
  1931. return ret;
  1932. }
  1933. lwp_get_from_user(&newset, (void *)sigset, size);
  1934. pnewset = &newset;
  1935. }
  1936. ret = lwp_sigprocmask(how, pnewset, poldset);
  1937. if (ret < 0)
  1938. {
  1939. return ret;
  1940. }
  1941. if (oset)
  1942. {
  1943. lwp_put_to_user(oset, poldset, size);
  1944. }
  1945. return ret;
  1946. }
  1947. int sys_tkill(int tid, int sig)
  1948. {
  1949. rt_thread_t thread = RT_NULL;
  1950. if (tid <= 0)
  1951. {
  1952. rt_set_errno(EINVAL);
  1953. return -RT_EINVAL;
  1954. }
  1955. thread = lwp_tid_get_thread(tid);
  1956. return lwp_thread_kill(thread, sig);
  1957. }
  1958. int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size)
  1959. {
  1960. int ret = -1;
  1961. lwp_sigset_t newset, *pnewset = RT_NULL;
  1962. lwp_sigset_t oldset, *poldset = RT_NULL;
  1963. if (!size)
  1964. {
  1965. rt_set_errno(EINVAL);
  1966. return ret;
  1967. }
  1968. if (!oset && !sigset)
  1969. {
  1970. rt_set_errno(EINVAL);
  1971. return ret;
  1972. }
  1973. if (size != sizeof(lwp_sigset_t))
  1974. {
  1975. rt_set_errno(EINVAL);
  1976. return ret;
  1977. }
  1978. if (oset)
  1979. {
  1980. if (!lwp_user_accessable((void *)oset, size))
  1981. {
  1982. rt_set_errno(EINVAL);
  1983. return ret;
  1984. }
  1985. poldset = &oldset;
  1986. }
  1987. if (sigset)
  1988. {
  1989. if (!lwp_user_accessable((void *)sigset, size))
  1990. {
  1991. rt_set_errno(EINVAL);
  1992. return ret;
  1993. }
  1994. lwp_get_from_user(&newset, (void *)sigset, sizeof(lwp_sigset_t));
  1995. pnewset = &newset;
  1996. }
  1997. ret = lwp_thread_sigprocmask(how, pnewset, poldset);
  1998. if (ret < 0)
  1999. {
  2000. return ret;
  2001. }
  2002. if (oset)
  2003. {
  2004. lwp_put_to_user(oset, poldset, sizeof(lwp_sigset_t));
  2005. }
  2006. return ret;
  2007. }
  2008. int32_t sys_waitpid(int32_t pid, int *status, int options)
  2009. {
  2010. return waitpid(pid, status, options);
  2011. }
  2012. #if defined(RT_USING_SAL) && defined(SAL_USING_POSIX)
  2013. struct musl_addrinfo
  2014. {
  2015. int ai_flags;
  2016. int ai_family;
  2017. int ai_socktype;
  2018. int ai_protocol;
  2019. socklen_t ai_addrlen;
  2020. struct musl_sockaddr *ai_addr;
  2021. char *ai_canonname;
  2022. struct musl_addrinfo *ai_next;
  2023. };
  2024. int sys_getaddrinfo(const char *nodename,
  2025. const char *servname,
  2026. const struct musl_addrinfo *hints,
  2027. struct musl_addrinfo *res)
  2028. {
  2029. int ret = -1;
  2030. struct addrinfo *k_res = NULL;
  2031. char *k_nodename = NULL;
  2032. char *k_servname = NULL;
  2033. struct addrinfo *k_hints = NULL;
  2034. if (nodename)
  2035. {
  2036. k_nodename = rt_strdup(nodename);
  2037. if (!k_nodename)
  2038. {
  2039. rt_set_errno(ENOMEM);
  2040. goto exit;
  2041. }
  2042. }
  2043. if (servname)
  2044. {
  2045. k_servname = rt_strdup(servname);
  2046. if (!k_servname)
  2047. {
  2048. rt_set_errno(ENOMEM);
  2049. goto exit;
  2050. }
  2051. }
  2052. if (hints)
  2053. {
  2054. k_hints = (struct addrinfo *) rt_malloc(sizeof *hints);
  2055. if (!k_hints)
  2056. {
  2057. rt_set_errno(ENOMEM);
  2058. goto exit;
  2059. }
  2060. rt_memset(k_hints, 0x0, sizeof(struct addrinfo));
  2061. k_hints->ai_flags = hints->ai_flags;
  2062. k_hints->ai_family = hints->ai_family;
  2063. k_hints->ai_socktype = hints->ai_socktype;
  2064. k_hints->ai_protocol = hints->ai_protocol;
  2065. k_hints->ai_addrlen = hints->ai_addrlen;
  2066. }
  2067. ret = sal_getaddrinfo(k_nodename, k_servname, k_hints, &k_res);
  2068. if (ret == 0)
  2069. {
  2070. /* set sockaddr */
  2071. sockaddr_tomusl(k_res->ai_addr, res->ai_addr);
  2072. res->ai_addrlen = k_res->ai_addrlen;
  2073. /* set up addrinfo */
  2074. res->ai_family = k_res->ai_family;
  2075. res->ai_flags = k_res->ai_flags;
  2076. res->ai_next = NULL;
  2077. if (hints != NULL)
  2078. {
  2079. /* copy socktype & protocol from hints if specified */
  2080. res->ai_socktype = hints->ai_socktype;
  2081. res->ai_protocol = hints->ai_protocol;
  2082. }
  2083. sal_freeaddrinfo(k_res);
  2084. k_res = NULL;
  2085. }
  2086. exit:
  2087. if (k_nodename)
  2088. {
  2089. rt_free(k_nodename);
  2090. }
  2091. if (k_servname)
  2092. {
  2093. rt_free(k_servname);
  2094. }
  2095. if (k_hints)
  2096. {
  2097. rt_free(k_hints);
  2098. }
  2099. return ret;
  2100. }
  2101. #define HOSTENT_BUFSZ 512
  2102. int sys_gethostbyname2_r(const char *name, int af, struct hostent *ret,
  2103. char *buf, size_t buflen,
  2104. struct hostent **result, int *err)
  2105. {
  2106. int ret_val = -1;
  2107. int sal_ret = -1 , sal_err = -1;
  2108. struct hostent sal_he;
  2109. struct hostent *sal_result = NULL;
  2110. char *sal_buf = NULL;
  2111. char *k_name = NULL;
  2112. if (result == NULL)
  2113. {
  2114. /* not all arguments given */
  2115. *err = EINVAL;
  2116. rt_set_errno(EINVAL);
  2117. goto __exit;
  2118. }
  2119. if ((name == NULL) || (ret == NULL) || (buf == NULL))
  2120. {
  2121. /* not all arguments given */
  2122. *err = EINVAL;
  2123. rt_set_errno(EINVAL);
  2124. goto __exit;
  2125. }
  2126. *result = ret;
  2127. sal_buf = (char *)malloc(HOSTENT_BUFSZ);
  2128. if (sal_buf == NULL)
  2129. {
  2130. rt_set_errno(ENOMEM);
  2131. goto __exit;
  2132. }
  2133. k_name = rt_strdup(name);
  2134. if (k_name == NULL)
  2135. {
  2136. rt_set_errno(ENOMEM);
  2137. goto __exit;
  2138. }
  2139. /* get host by name in SAL */
  2140. sal_ret = sal_gethostbyname_r(k_name, &sal_he, sal_buf, HOSTENT_BUFSZ, &sal_result, &sal_err);
  2141. if (sal_ret == 0)
  2142. {
  2143. int index = 0, cnt = 0;
  2144. char *ptr = buf;
  2145. /* get counter */
  2146. index = 0;
  2147. while (sal_he.h_addr_list[index] != NULL)
  2148. {
  2149. index++;
  2150. }
  2151. cnt = index + 1;
  2152. /* update user space hostent */
  2153. ret->h_addrtype = sal_he.h_addrtype;
  2154. ret->h_length = sal_he.h_length;
  2155. rt_strncpy(ptr, k_name, buflen - (ptr - buf));
  2156. ret->h_name = ptr;
  2157. ptr += rt_strlen(k_name);
  2158. ret->h_addr_list = (char**)ptr;
  2159. ptr += cnt * sizeof(char *);
  2160. index = 0;
  2161. while (sal_he.h_addr_list[index] != NULL)
  2162. {
  2163. ret->h_addr_list[index] = ptr;
  2164. rt_memcpy(ptr, sal_he.h_addr_list[index], sal_he.h_length);
  2165. ptr += sal_he.h_length;
  2166. index++;
  2167. }
  2168. ret->h_addr_list[index] = NULL;
  2169. }
  2170. ret_val = 0;
  2171. __exit:
  2172. /* release buffer */
  2173. if (sal_buf)
  2174. {
  2175. free(sal_buf);
  2176. }
  2177. if (k_name)
  2178. {
  2179. free(k_name);
  2180. }
  2181. return ret_val;
  2182. }
  2183. #endif
  2184. char *sys_getcwd(char *buf, size_t size)
  2185. {
  2186. return getcwd(buf, size);
  2187. }
  2188. int sys_chdir(const char *path)
  2189. {
  2190. return chdir(path);
  2191. }
  2192. int sys_mkdir(const char *path, mode_t mode)
  2193. {
  2194. return mkdir(path, mode);
  2195. }
  2196. int sys_rmdir(const char *path)
  2197. {
  2198. return unlink(path);
  2199. }
  2200. typedef uint64_t ino_t;
  2201. struct libc_dirent {
  2202. ino_t d_ino;
  2203. off_t d_off;
  2204. unsigned short d_reclen;
  2205. unsigned char d_type;
  2206. char d_name[256];
  2207. };
  2208. int sys_getdents(int fd, struct libc_dirent *dirp, size_t nbytes)
  2209. {
  2210. int ret = -1;
  2211. struct dfs_fd *dfs_fd;
  2212. size_t cnt = (nbytes / sizeof(struct libc_dirent));
  2213. size_t rtt_nbytes = 0;
  2214. struct dirent *rtt_dirp;
  2215. if (cnt == 0)
  2216. {
  2217. rt_set_errno(EINVAL);
  2218. return -1;
  2219. }
  2220. rtt_nbytes = cnt * sizeof(struct dirent);
  2221. rtt_dirp = (struct dirent *)rt_malloc(rtt_nbytes);
  2222. if (!rtt_dirp)
  2223. {
  2224. rt_set_errno(ENOMEM);
  2225. return -1;
  2226. }
  2227. dfs_fd = fd_get(fd);
  2228. ret = dfs_file_getdents(dfs_fd, rtt_dirp, nbytes);
  2229. if (ret)
  2230. {
  2231. size_t i = 0;
  2232. cnt = ret / sizeof(struct dirent);
  2233. for (i = 0; i < cnt; i++)
  2234. {
  2235. dirp[i].d_ino = 0;
  2236. dirp[i].d_off = i*sizeof(struct libc_dirent);
  2237. dirp[i].d_type = rtt_dirp[i].d_type;
  2238. dirp[i].d_reclen = sizeof(struct libc_dirent);
  2239. strcpy(dirp[i].d_name, rtt_dirp[i].d_name);
  2240. }
  2241. ret = cnt * sizeof(struct libc_dirent);
  2242. }
  2243. rt_free(rtt_dirp);
  2244. return ret;
  2245. }
  2246. rt_err_t sys_get_errno(void)
  2247. {
  2248. return rt_get_errno();
  2249. }
  2250. int sys_set_thread_area(void *p)
  2251. {
  2252. rt_thread_t thread;
  2253. thread = rt_thread_self();
  2254. thread->thread_idr = p;
  2255. lwp_set_thread_area(p);
  2256. return 0;
  2257. }
  2258. int sys_set_tid_address(int *tidptr)
  2259. {
  2260. rt_thread_t thread = rt_thread_self();
  2261. thread->clear_child_tid = tidptr;
  2262. return thread->tid;
  2263. }
  2264. int sys_access(const char *filename, int mode)
  2265. {
  2266. int ret = -1;
  2267. #ifdef RT_USING_USERSPACE
  2268. rt_size_t len = 0;
  2269. char *kname = RT_NULL;
  2270. if (!lwp_user_accessable((void *)filename, 1))
  2271. {
  2272. rt_set_errno(EINVAL);
  2273. return -1;
  2274. }
  2275. len = rt_strlen(filename);
  2276. if (!len)
  2277. {
  2278. rt_set_errno(EINVAL);
  2279. return -1;
  2280. }
  2281. kname = (char *)kmem_get(len + 1);
  2282. if (!kname)
  2283. {
  2284. rt_set_errno(ENOMEM);
  2285. return -1;
  2286. }
  2287. lwp_get_from_user(kname, (void *)filename, len + 1);
  2288. ret = access(kname, mode);
  2289. kmem_put(kname);
  2290. #else
  2291. ret = access(filename, mode);
  2292. #endif
  2293. return (ret >= 0)? 0: ret;
  2294. }
  2295. int sys_pipe(int fd[2])
  2296. {
  2297. if (!lwp_user_accessable((void *)fd, sizeof(int[2])))
  2298. {
  2299. rt_set_errno(EINVAL);
  2300. return -1;
  2301. }
  2302. return pipe(fd);
  2303. }
  2304. int sys_clock_settime(clockid_t clk, const struct timespec *ts)
  2305. {
  2306. rt_device_t device;
  2307. time_t now;
  2308. device = rt_device_find("rtc");
  2309. if (device == RT_NULL)
  2310. {
  2311. return -ENODEV;
  2312. }
  2313. #ifdef RT_USING_USERSPACE
  2314. size_t size = sizeof(struct timespec);
  2315. struct timespec *kts = NULL;
  2316. if (!lwp_user_accessable((void *)ts, size))
  2317. {
  2318. return -EINVAL;
  2319. }
  2320. kts = kmem_get(size);
  2321. if (!kts)
  2322. {
  2323. return -ENOMEM;
  2324. }
  2325. lwp_get_from_user(kts, (void *)ts, size);
  2326. now = kts->tv_sec;
  2327. kmem_put(kts);
  2328. #else
  2329. now = ts->tv_sec;
  2330. #endif
  2331. return rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
  2332. }
  2333. int sys_clock_gettime(clockid_t clk, struct timespec *ts)
  2334. {
  2335. int ret = 0;
  2336. rt_device_t device;
  2337. time_t now;
  2338. device = rt_device_find("rtc");
  2339. if (device == RT_NULL)
  2340. {
  2341. return -ENODEV;
  2342. }
  2343. ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &now);
  2344. #ifdef RT_USING_USERSPACE
  2345. size_t size = sizeof(struct timespec);
  2346. struct timespec *kts = NULL;
  2347. if (!lwp_user_accessable((void *)ts, size))
  2348. {
  2349. return -EINVAL;
  2350. }
  2351. kts = kmem_get(size);
  2352. if (!kts)
  2353. {
  2354. return -ENOMEM;
  2355. }
  2356. kts->tv_sec = now;
  2357. kts->tv_nsec = 0;
  2358. lwp_put_to_user(ts, kts, size);
  2359. kmem_put(kts);
  2360. #else
  2361. ts->tv_sec = now;
  2362. ts->tv_nsec = 0;
  2363. #endif
  2364. return ret;
  2365. }
  2366. int sys_clock_getres(clockid_t clk, struct timespec *ts)
  2367. {
  2368. #ifdef RT_USING_USERSPACE
  2369. struct timespec kts;
  2370. size_t size = sizeof(struct timespec);
  2371. if (!lwp_user_accessable((void *)ts, size))
  2372. {
  2373. return -EINVAL;
  2374. }
  2375. kts.tv_sec = 1;
  2376. kts.tv_nsec = 0;
  2377. lwp_put_to_user(ts, &kts, size);
  2378. #else
  2379. ts->tv_sec = 1;
  2380. ts->tv_nsec = 0;
  2381. #endif
  2382. return 0;
  2383. }
  2384. int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3);
  2385. int sys_pmutex(void *umutex, int op, void *arg);
  2386. int sys_dup(int oldfd);
  2387. int sys_dup2(int oldfd, int new);
  2388. int sys_rename(const char *oldpath,const char *newpath)
  2389. {
  2390. return rename(oldpath,newpath);
  2391. }
  2392. const static void* func_table[] =
  2393. {
  2394. (void *)sys_exit, /* 01 */
  2395. (void *)sys_read,
  2396. (void *)sys_write,
  2397. (void *)sys_lseek,
  2398. (void *)sys_open, /* 05 */
  2399. (void *)sys_close,
  2400. (void *)sys_ioctl,
  2401. (void *)sys_fstat,
  2402. (void *)sys_poll,
  2403. (void *)sys_nanosleep, /* 10 */
  2404. (void *)sys_gettimeofday,
  2405. (void *)sys_settimeofday,
  2406. (void *)sys_exec,
  2407. (void *)sys_kill,
  2408. (void *)sys_getpid, /* 15 */
  2409. (void *)sys_getpriority,
  2410. (void *)sys_setpriority,
  2411. (void *)sys_sem_create,
  2412. (void *)sys_sem_delete,
  2413. (void *)sys_sem_take, /* 20 */
  2414. (void *)sys_sem_release,
  2415. (void *)sys_mutex_create,
  2416. (void *)sys_mutex_delete,
  2417. (void *)sys_mutex_take,
  2418. (void *)sys_mutex_release, /* 25 */
  2419. (void *)sys_event_create,
  2420. (void *)sys_event_delete,
  2421. (void *)sys_event_send,
  2422. (void *)sys_event_recv,
  2423. (void *)sys_mb_create, /* 30 */
  2424. (void *)sys_mb_delete,
  2425. (void *)sys_mb_send,
  2426. (void *)sys_mb_send_wait,
  2427. (void *)sys_mb_recv,
  2428. (void *)sys_mq_create, /* 35 */
  2429. (void *)sys_mq_delete,
  2430. (void *)sys_mq_send,
  2431. (void *)sys_mq_urgent,
  2432. (void *)sys_mq_recv,
  2433. (void *)sys_thread_create, /* 40 */
  2434. (void *)sys_thread_delete,
  2435. (void *)sys_thread_startup,
  2436. (void *)sys_thread_self,
  2437. (void *)sys_channel_open,
  2438. (void *)sys_channel_close, /* 45 */
  2439. (void *)sys_channel_send,
  2440. (void *)sys_channel_send_recv_timeout,
  2441. (void *)sys_channel_reply,
  2442. (void *)sys_channel_recv_timeout,
  2443. (void *)sys_enter_critical, /* 50 */
  2444. (void *)sys_exit_critical,
  2445. SYSCALL_USPACE(sys_brk),
  2446. SYSCALL_USPACE(sys_mmap2),
  2447. SYSCALL_USPACE(sys_munmap),
  2448. SYSCALL_USPACE(sys_shmget), /* 55 */
  2449. SYSCALL_USPACE(sys_shmrm),
  2450. SYSCALL_USPACE(sys_shmat),
  2451. SYSCALL_USPACE(sys_shmdt),
  2452. (void *)sys_device_init,
  2453. (void *)sys_device_register, /* 60 */
  2454. (void *)sys_device_control,
  2455. (void *)sys_device_find,
  2456. (void *)sys_device_open,
  2457. (void *)sys_device_close,
  2458. (void *)sys_device_read, /* 65 */
  2459. (void *)sys_device_write,
  2460. (void *)sys_stat,
  2461. (void *)sys_thread_find,
  2462. SYSCALL_NET(sys_accept),
  2463. SYSCALL_NET(sys_bind), /* 70 */
  2464. SYSCALL_NET(sys_shutdown),
  2465. SYSCALL_NET(sys_getpeername),
  2466. SYSCALL_NET(sys_getsockname),
  2467. SYSCALL_NET(sys_getsockopt),
  2468. SYSCALL_NET(sys_setsockopt), /* 75 */
  2469. SYSCALL_NET(sys_connect),
  2470. SYSCALL_NET(sys_listen),
  2471. SYSCALL_NET(sys_recv),
  2472. SYSCALL_NET(sys_recvfrom),
  2473. SYSCALL_NET(sys_send), /* 80 */
  2474. SYSCALL_NET(sys_sendto),
  2475. SYSCALL_NET(sys_socket),
  2476. SYSCALL_NET(sys_closesocket),
  2477. SYSCALL_NET(sys_getaddrinfo),
  2478. SYSCALL_NET(sys_gethostbyname2_r), /* 85 */
  2479. (void *)sys_notimpl, //(void *)network,
  2480. (void *)sys_notimpl, //(void *)network,
  2481. (void *)sys_notimpl, //(void *)network,
  2482. (void *)sys_notimpl, //(void *)network,
  2483. (void *)sys_notimpl, //(void *)network, /* 90 */
  2484. (void *)sys_notimpl, //(void *)network,
  2485. (void *)sys_notimpl, //(void *)network,
  2486. (void *)sys_notimpl, //(void *)network,
  2487. #ifdef RT_USING_DFS
  2488. (void *)sys_select,
  2489. #else
  2490. (void *)sys_notimpl,
  2491. #endif
  2492. (void *)sys_notimpl, //(void *)sys_hw_interrupt_disable, /* 95 */
  2493. (void *)sys_notimpl, //(void *)sys_hw_interrupt_enable,
  2494. (void *)sys_tick_get,
  2495. (void *)sys_exit_group,
  2496. (void *)sys_notimpl, //(void *)rt_delayed_work_init,
  2497. (void *)sys_notimpl, //(void *)rt_work_submit, /* 100 */
  2498. (void *)sys_notimpl, //(void *)rt_wqueue_wakeup,
  2499. (void *)sys_thread_mdelay,
  2500. (void *)sys_sigaction,
  2501. (void *)sys_sigprocmask,
  2502. (void *)sys_tkill, /* 105 */
  2503. (void *)sys_notimpl,
  2504. (void *)sys_thread_sigprocmask,
  2505. (void *)sys_notimpl,
  2506. (void *)sys_notimpl,
  2507. (void *)sys_waitpid, /* 110 */
  2508. (void *)sys_timer_create,
  2509. (void *)sys_timer_delete,
  2510. (void *)sys_timer_start,
  2511. (void *)sys_timer_stop,
  2512. (void *)sys_timer_control, /* 115 */
  2513. (void *)sys_getcwd,
  2514. (void *)sys_chdir,
  2515. (void *)sys_unlink,
  2516. (void *)sys_mkdir,
  2517. (void *)sys_rmdir, /* 120 */
  2518. (void *)sys_getdents,
  2519. (void *)sys_get_errno,
  2520. (void *)sys_set_thread_area,
  2521. (void *)sys_set_tid_address,
  2522. (void *)sys_access, /* 125 */
  2523. (void *)sys_pipe,
  2524. (void *)sys_clock_settime,
  2525. (void *)sys_clock_gettime,
  2526. (void *)sys_clock_getres,
  2527. (void *)sys_clone, /* 130 */
  2528. (void *)sys_futex,
  2529. (void *)sys_pmutex,
  2530. (void *)sys_dup,
  2531. (void *)sys_dup2,
  2532. (void *)sys_rename, /* 135 */
  2533. (void *)sys_fork,
  2534. };
  2535. const void *lwp_get_sys_api(rt_uint32_t number)
  2536. {
  2537. const void *func = (const void *)sys_notimpl;
  2538. if (number == 0xff)
  2539. {
  2540. func = (void *)sys_log;
  2541. }
  2542. else
  2543. {
  2544. number -= 1;
  2545. if (number < sizeof(func_table) / sizeof(func_table[0]))
  2546. {
  2547. func = func_table[number];
  2548. }
  2549. }
  2550. return func;
  2551. }