Changeset 441 for EcnlProtoTool/trunk/ntshell/src/main.c
- Timestamp:
- Jul 10, 2020, 9:09:25 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/src/main.c
r434 r441 48 48 #include "syssvc/serial.h" 49 49 #include "syssvc/syslog.h" 50 #include "target_syssvc.h" 50 51 #include "kernel_cfg.h" 51 52 #include "main.h" 52 #include "rza1.h" 53 #include "fdtable.h" 54 #ifndef NTSHELL_NO_SOCKET 53 55 #include <tinet_config.h> 54 56 #include <netinet/in.h> … … 70 72 #include "usrcmd.h" 71 73 #include "util/ntopt.h" 72 #include "fdtable.h" 73 #include "target_syssvc.h" 74 #include "netapp/dhcp4_cli.h" 75 #include "ntp_cli.h" 76 #include "netcmd.h" 77 #endif 74 78 75 79 ID ws_api_mailboxid = MAIN_DATAQUEUE; 76 80 ID ws_mempoolid = MPF_NET_BUF_256; 81 extern ntstdio_t *ntstdio; 77 82 78 83 char command[NTOPT_TEXT_MAXLEN]; 79 ntstdio_t ntstdio;80 81 unsigned char ntstdio_xi(struct ntstdio_t *handle)82 {83 char buf[1];84 if(serial_rea_dat(SIO_PORTID, buf, 1) != 1)85 return -EIO;86 return buf[0];87 }88 89 void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)90 {91 char buf[1];92 buf[0] = c;93 serial_wri_dat(SIO_PORTID, buf, 1);94 }95 84 96 85 const uint8_t mac_addr[6] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}; … … 101 90 "3.5.0", 102 91 TARGET_NAME, 103 92 "toppers.jp" 104 93 }; 105 94 … … 113 102 main_state_start, 114 103 main_state_idle, 104 #ifndef NTSHELL_NO_SOCKET 105 main_state_start_dhcp, 106 #endif 107 main_state_servey_cmd, 115 108 }; 116 109 117 110 struct main_obj_t { 118 111 ntshell_t ntshell; 119 TMOtimer;112 int timer; 120 113 enum main_state_t state; 121 114 SYSTIM prev, now; 122 WS_FBS_ID rcvmsg; 123 T_WS_FBS_QUEUE wbs_queue; 124 WS_FBS_ID sndmsg; 115 task_base_t **tasks; 116 int task_count; 117 #ifndef NTSHELL_NO_SOCKET 118 uint8_t link; 119 uint8_t link_up; 120 uint8_t up; 121 uint8_t dhcp; 122 uint8_t ntp; 123 ntp_cli_state_t ntp_state; 124 #endif 125 bool_t exec; 126 int event_req, event_res; 125 127 }; 126 128 struct main_obj_t main_obj; 127 129 128 static void main_change_netif_link(T_IFNET *ether); 130 #ifndef NTSHELL_NO_SOCKET 131 static void netif_link_callback(T_IFNET *ether); 132 static void main_change_netif_link(uint8_t link_up, uint8_t up); 133 #endif 129 134 static void main_initialize(struct main_obj_t *obj); 130 static TMO main_get_timer(struct main_obj_t *obj); 131 static void main_progress(struct main_obj_t *obj, TMO elapse); 132 static void main_timeout(struct main_obj_t *obj); 133 extern int execute_command(int wait); 135 static void main_finalize(struct main_obj_t *obj); 136 static int main_get_timer(struct main_obj_t *obj); 137 static void main_progress(struct main_obj_t *obj, int elapse); 138 static void main_timeout(struct main_obj_t *obj, bool_t wakeup); 139 static int execute_command(struct main_obj_t *obj, int wait); 134 140 static int usrcmd_ntopt_callback(long *args, void *extobj); 135 141 #ifndef NTSHELL_NO_SOCKET 142 static void ntp_cli_state_changed(ntp_cli_state_t state); 143 #endif 144 145 void stdio_open(ID portid); 146 void stdio_input(unsigned char c); 147 148 bool_t dhcp_enable; 149 int ntshell_exit; 136 150 int shellcmd_exit_code; 137 151 volatile int shellcmd_state; … … 139 153 jmp_buf shellcmd_exit; 140 154 155 void main_task_init(task_base_t **tasks, int task_count) 156 { 157 main_obj.tasks = tasks; 158 main_obj.task_count = task_count; 159 } 160 141 161 int uart_read(char *buf, int cnt, void *extobj) 142 162 { 143 return serial_rea_dat(SIO_PORTID, (char *)buf, cnt); 163 struct main_obj_t *obj = (struct main_obj_t *)extobj; 164 int result; 165 ER ret; 166 int timer; 167 bool_t wakeup = false; 168 169 obj->prev = obj->now; 170 171 if (obj->event_req != obj->event_res) { 172 obj->event_res = obj->event_req; 173 wakeup = true; 174 #ifndef NTSHELL_NO_SOCKET 175 if (obj->dhcp) { 176 obj->dhcp = 0; 177 obj->state = main_state_start_dhcp; 178 } 179 #endif 180 obj->timer = 0; 181 } 182 183 /* タイマー取得 */ 184 timer = main_get_timer(obj); 185 186 /* 待ち */ 187 ret = serial_trea_dat(SIO_PORTID, buf, cnt, timer); 188 if ((ret < 0) && (ret != E_OK) && (ret != E_TMOUT) && (ret != E_RLWAI)) { 189 syslog(LOG_NOTICE, "tslp_tsk ret: %s %d", itron_strerror(ret), timer); 190 ntshell_exit = 1; 191 return -1; 192 } 193 if (ret != E_TMOUT) 194 wakeup = true; 195 result = (int)ret; 196 197 ret = get_tim(&obj->now); 198 if (ret != E_OK) { 199 syslog(LOG_NOTICE, "get_tim ret: %s", itron_strerror(ret)); 200 ntshell_exit = 1; 201 return -1; 202 } 203 204 /* 時間経過 */ 205 int elapse = obj->now - obj->prev; 206 main_progress(obj, elapse); 207 208 /* タイムアウト処理 */ 209 main_timeout(obj, wakeup); 210 211 return result; 144 212 } 145 213 … … 162 230 } 163 231 164 return execute_command(tskid == MAIN_TASK); 165 } 232 return execute_command(&main_obj, tskid == MAIN_TASK); 233 } 234 235 gpio_t led_blue, led_green, led_red, sw; 166 236 167 237 /* 168 * メインタスク238 * メインタスク 169 239 */ 170 240 void main_task(intptr_t exinf) 171 241 { 172 242 struct main_obj_t *obj = (struct main_obj_t *)&main_obj; 243 244 gpio_init_out(&led_blue, LED_BLUE); 245 gpio_init_out(&led_green, LED_GREEN); 246 gpio_init_out(&led_red, LED_RED); 247 gpio_init_in(&sw, USER_BUTTON0); 248 249 obj->exec = gpio_read(&sw) == 1; 250 251 gpio_write(&led_blue, 1); 252 gpio_write(&led_green, obj->exec ? 1 : 0); 253 gpio_write(&led_red, 0); 254 255 ether_set_link_callback(main_change_netif_link); 256 257 /* 初期化 */ 258 ffarch_init(); 259 260 stdio_open(SIO_PORTID); 261 262 #ifndef NTSHELL_NO_SOCKET 263 ntp_cli_set_state_changed_cb(ntp_cli_state_changed); 264 #endif 173 265 174 266 main_initialize(obj); … … 177 269 ntshell_set_prompt(&obj->ntshell, "NTShell>"); 178 270 ntshell_execute(&obj->ntshell); 271 272 main_finalize(obj); 179 273 } 180 274 … … 184 278 static void main_initialize(struct main_obj_t *obj) 185 279 { 186 FILINFO fno;187 #if FF_USE_LFN188 char lfn[FF_MAX_LFN + 1];189 fno.lfname = lfn;190 fno.lfsize = FF_MAX_LFN + 1;191 #endif192 280 ER ret; 193 194 ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo); 195 196 obj->timer = TMO_FEVR; 281 ID tskid = 0; 282 283 ret = get_tid(&tskid); 284 if (ret != E_OK) { 285 syslog(LOG_ERROR, "get_tid %d", ret); 286 return; 287 } 288 289 obj->timer = 100000; 197 290 obj->state = main_state_start; 198 291 199 gpio_t led_blue, led_green, led_red, sw; 200 gpio_init_out(&led_blue, LED_BLUE); 201 gpio_init_out(&led_green, LED_GREEN); 202 gpio_init_out(&led_red, LED_RED); 203 gpio_init_in(&sw, USER_BUTTON0); 204 205 bool_t exec = gpio_read(&sw) == 1; 206 207 gpio_write(&led_blue, 1); 208 gpio_write(&led_green, exec ? 1 : 0); 209 gpio_write(&led_red, 0); 210 211 ether_set_link_callback(main_change_netif_link); 212 213 /* 初期化 */ 214 if (mruby_arduino_init() == 0) { 215 gpio_write(&led_blue, 0); 216 } 217 else { 218 gpio_write(&led_blue, 0); 219 gpio_write(&led_red, 1); 220 } 221 292 for (int i = 0; i < obj->task_count; i++) { 293 task_base_t *task = obj->tasks[i]; 294 task->on_start(task, tskid); 295 } 296 297 gpio_write(&led_blue, 0); 222 298 gpio_write(&led_green, 0); 223 299 224 300 act_tsk(HTTPD1_TASK); 225 301 act_tsk(HTTPD2_TASK); 226 227 if (f_stat("1:/upload/main.mrb", &fno) != FR_OK) {228 exec = false;229 }230 231 if (exec) {232 ntlibc_strlcpy(command, "mruby -b 1:/upload/main.mrb", sizeof(command));233 234 execute_command(1);235 }236 302 237 303 ret = get_tim(&obj->now); … … 243 309 } 244 310 311 static void main_finalize(struct main_obj_t *obj) 312 { 313 for (int i = 0; i < obj->task_count; i++) { 314 task_base_t *task = obj->tasks[i]; 315 task->on_end(task); 316 } 317 } 318 245 319 /* 246 320 * タイマー取得 247 321 */ 248 static TMO main_get_timer(struct main_obj_t *obj) 249 { 250 TMO timer = obj->timer; 322 static int main_get_timer(struct main_obj_t *obj) 323 { 324 int timer = obj->timer; 325 326 for (int i = 0; i < obj->task_count; i++) { 327 task_base_t *task = obj->tasks[i]; 328 int timer2 = task->get_timer(task); 329 if ((timer == -1) || ((timer2 != -1) && (timer > timer2))) 330 timer = timer2; 331 } 251 332 252 333 return timer; … … 256 337 * 時間経過 257 338 */ 258 static void main_progress(struct main_obj_t *obj, TMOelapse)339 static void main_progress(struct main_obj_t *obj, int elapse) 259 340 { 260 341 if (obj->timer != TMO_FEVR) { … … 264 345 } 265 346 } 347 348 for (int i = 0; i < obj->task_count; i++) { 349 task_base_t *task = obj->tasks[i]; 350 task->progress(task, elapse); 351 } 266 352 } 267 353 … … 269 355 * タイムアウト処理 270 356 */ 271 static void main_timeout(struct main_obj_t *obj) 272 { 273 //if (obj->timer == 0) { 274 //} 275 } 276 357 static void main_timeout(struct main_obj_t *obj, bool_t wakeup) 358 { 359 ER ret; 360 uint32_t event = wakeup ? MAIN_EVENT_WAKEUP : 0; 361 362 if (!wakeup && (obj->timer != 0)) 363 return; 364 365 switch (obj->state) { 366 case main_state_start: 367 #ifndef NTSHELL_NO_SOCKET 368 ether_set_link_callback(netif_link_callback); 369 #endif 370 { 371 FILINFO fno; 372 #if FF_USE_LFN 373 char lfn[FF_MAX_LFN + 1]; 374 fno.lfname = lfn; 375 fno.lfsize = FF_MAX_LFN + 1; 376 #endif 377 if (f_stat("1:/upload/main.mrb", &fno) != FR_OK) { 378 obj->exec = false; 379 } 380 381 if (obj->exec) { 382 cmd_execute("mruby -b 1:/upload/main.mrb", obj); 383 } 384 } 385 obj->state = main_state_idle; 386 obj->timer = TMO_FEVR; 387 break; 388 #ifndef NTSHELL_NO_SOCKET 389 case main_state_start_dhcp: 390 ret = dhcp4c_renew_info(); 391 if (ret == E_OK) { 392 obj->state = main_state_idle; 393 obj->timer = TMO_FEVR; 394 } 395 else { 396 obj->state = main_state_start_dhcp; 397 obj->timer = 1000000; 398 } 399 break; 400 #endif 401 default: 402 obj->state = main_state_idle; 403 obj->timer = TMO_FEVR; 404 break; 405 } 406 #ifndef NTSHELL_NO_SOCKET 407 if (obj->link) { 408 obj->link = 0; 409 event |= MAIN_EVENT_NETIF_CHANGED; 410 if (obj->link_up) 411 event |= MAIN_EVENT_LINK_UP; 412 if (obj->up) 413 event |= MAIN_EVENT_UP; 414 415 if (obj->link_up && obj->up) 416 ntp_cli_execute(); 417 418 main_change_netif_link(obj->link_up, obj->up); 419 } 420 if (obj->ntp) { 421 obj->ntp = 0; 422 if (obj->ntp_state != NTP_CLI_STATE_SYNC) 423 event |= MAIN_EVENT_NTP_ASYNC; 424 else 425 event |= MAIN_EVENT_NTP_SYNC; 426 } 427 #endif 428 for (int i = 0; i < obj->task_count; i++) { 429 task_base_t *task = obj->tasks[i]; 430 task->process(task, event); 431 } 432 } 433 434 #ifndef NTSHELL_NO_SOCKET 277 435 /* MACアドレスの設定時に呼ばれる */ 278 436 void mbed_mac_address(char *mac) … … 281 439 } 282 440 283 static void main_change_netif_link(T_IFNET *ether)441 void main_change_netif_link(uint8_t link_up, uint8_t up) 284 442 { 285 443 FLGPTN flgptn; … … 295 453 set_flg(FLG_SELECT_WAIT, flgptn); 296 454 } 455 456 void netif_link_callback(T_IFNET *ether) 457 { 458 struct main_obj_t *obj = (struct main_obj_t *)&main_obj; 459 uint8_t link_up = (ether->flags & IF_FLAG_LINK_UP) != 0; 460 uint8_t up = (ether->flags & IF_FLAG_UP) != 0; 461 bool_t wake = false; 462 463 if (dhcp_enable) { 464 if (!link_up) 465 dhcp4c_rel_info(); 466 else if (!up) { 467 wake = dhcp4c_renew_info() != E_OK; 468 if (wake) { 469 obj->dhcp = 1; 470 } 471 } 472 } 473 else { 474 up = link_up; 475 } 476 477 if ((obj->link_up != link_up) || (obj->up != up)) { 478 obj->link = 1; 479 wake = true; 480 } 481 482 obj->link_up = link_up; 483 obj->up = up; 484 485 if (wake && (obj->event_req == obj->event_res)) { 486 obj->event_req++; 487 rel_wai(MAIN_TASK); 488 } 489 } 490 491 void ntp_cli_state_changed(ntp_cli_state_t state) 492 { 493 struct main_obj_t *obj = (struct main_obj_t *)&main_obj; 494 bool_t wake = obj->ntp_state != state; 495 496 if (wake) { 497 obj->ntp_state = state; 498 obj->ntp = 1; 499 500 if (obj->event_req == obj->event_res) { 501 obj->event_req++; 502 rel_wai(MAIN_TASK); 503 } 504 } 505 } 506 #endif 297 507 298 508 /* … … 302 512 { 303 513 shellcmd_state = 1; 304 shellcmd_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL); 514 515 if (setjmp(shellcmd_exit) == 0) { 516 shellcmd_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL); 517 } 518 519 //fflush(stdout); 520 clean_fd(); 521 305 522 shellcmd_state = 2; 306 523 } … … 315 532 {"hexdump", "Hex dump", usrcmd_hexdump}, 316 533 {"date", "print date and time", usrcmd_date}, 534 #ifndef NTSHELL_NO_SOCKET 535 {"ping", "ping", usrcmd_ping}, 536 {"dhcpc", "DHCP Client rel/renew/info", usrcmd_dhcp4c}, 537 {"dnsc", "DNS client", usrcmd_dnsc }, 538 {"ntpc", "NTP client", usrcmd_ntpc }, 539 #endif 317 540 {"info", "This is a description text string for info command.", usrcmd_info}, 318 541 {"exit", "Exit Natural Tiny Shell", usrcmd_exit}, … … 330 553 331 554 if (ntlibc_strcmp((const char *)args[1], "help") == 0) { 332 usrcmd_help(args[0], (char **)&args[1]); 555 found = 1; 556 result = usrcmd_help(args[0], (char **)&args[1]); 333 557 } 334 558 else for (int i = 0; i < cmd_table_info.count; i++) { 335 559 if (ntlibc_strcmp((const char *)args[1], p->cmd) == 0) { 336 return p->func(args[0], (char **)&args[1]); 560 found = 1; 561 result = p->func(args[0], (char **)&args[1]); 562 break; 337 563 } 338 564 p++; 339 565 } 340 if (setjmp(shellcmd_exit) == 0) { 341 (*((PowerOn_Reset_t *)0x18220000))(args); 342 } 343 clean_fd(); 344 return 0; 566 567 if ((found == 0) && setjmp(shellcmd_exit) == 0) { 568 found = 1; 569 (*((PowerOn_Reset_t *)0x18200000))(args); 570 } 571 572 if ((found == 0) && (((const char *)args[1])[0] != '\0')) 573 ntstdio_printf(ntstdio, "Unknown command found. %s \n", (const char *)args[1]); 574 575 return result; 345 576 } 346 577 … … 349 580 const cmd_table_t *p = cmd_table_info.table; 350 581 for (int i = 0; i < cmd_table_info.count; i++) { 351 ntstdio_puts( &ntstdio, p->cmd);352 ntstdio_puts( &ntstdio, "\t:");353 ntstdio_puts( &ntstdio, p->desc);354 ntstdio_puts( &ntstdio, "\n");582 ntstdio_puts(ntstdio, p->cmd); 583 ntstdio_puts(ntstdio, "\t:"); 584 ntstdio_puts(ntstdio, p->desc); 585 ntstdio_puts(ntstdio, "\n"); 355 586 p++; 356 587 } … … 372 603 void shell_abort() 373 604 { 374 asm("bkpt #0");375 376 605 shellcmd_exit_code = -1; 377 606 longjmp(shellcmd_exit, 1); … … 390 619 } 391 620 392 int execute_command(int wait) 393 { 621 int execute_command(struct main_obj_t *obj, int wait) 622 { 623 T_RTSK rtsk; 394 624 ER ret; 395 625 … … 399 629 } 400 630 401 tslp_tsk(100000); 631 if (ret == E_OK) 632 tslp_tsk(100000); 402 633 403 634 clean_fd(); … … 413 644 414 645 do { 415 tslp_tsk(100000); 646 obj->state = main_state_servey_cmd; 647 obj->timer = 100000; 648 649 char c; 650 if (obj->ntshell.func_read(&c, sizeof(c), obj->ntshell.extobj) == 1) { 651 // Ctrl+Cが押された場合 652 if (c == 0x03) { 653 // コマンドタスクを終了 654 ret = ter_tsk(SHELLCMD_TASK); 655 if (ret != E_OK) { 656 syslog(LOG_ERROR, "ter_tsk => %d", ret); 657 } 658 shellcmd_exit_code = -1; 659 shellcmd_state = 4; 660 if (ret == E_OK) 661 tslp_tsk(100000); 662 break; 663 } 664 665 stdio_input(c); 666 } 667 668 ret = ref_tsk(SHELLCMD_TASK, &rtsk); 669 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT)) 670 shellcmd_state = 3; 416 671 } while(shellcmd_state == 1); 417 672 673 obj->state = main_state_idle; 674 obj->timer = TMO_FEVR; 675 676 clean_fd(); 677 418 678 return shellcmd_exit_code; 419 679 } … … 421 681 int shell_clock_getres(clockid_t clk_id, struct timespec *res) 422 682 { 423 if ( clk_id != CLOCK_REALTIME)683 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC)) 424 684 return -EINVAL; 425 685 … … 434 694 SYSTIM now = 0; 435 695 436 if ( clk_id != CLOCK_REALTIME)696 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC)) 437 697 return -EINVAL; 438 698 … … 446 706 int shell_clock_settime(clockid_t clk_id, const struct timespec *tp) 447 707 { 448 if ( clk_id != CLOCK_REALTIME)708 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC)) 449 709 return -EINVAL; 450 710 451 rtc_write(tp->tv_sec); 711 SYSTIM time; 712 ER ret; 713 714 time = (tp->tv_sec * 1000000ll) + (tp->tv_nsec / 1000ll); 715 716 ret = set_tim(time); 717 if (ret != E_OK) { 718 return -EPERM; 719 } 452 720 453 721 return 0; … … 482 750 } 483 751 484 struct sigaction sigtable[6]; 485 486 int shell_sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old) 487 { 488 struct sigaction *sat; 752 // musl-1.1.18\src\internal\ksigaction.h 753 struct k_sigaction { 754 void(*handler)(int); 755 unsigned long flags; 756 void(*restorer)(void); 757 unsigned mask[2]; 758 }; 759 760 struct k_sigaction sigtable[7]; 761 762 int shell_sigaction(int sig, const struct k_sigaction *restrict sa, 763 struct k_sigaction *restrict old, size_t size) 764 { 765 struct k_sigaction *sat; 489 766 490 767 switch(sig){ … … 507 784 sat = &sigtable[5]; 508 785 break; 786 case SIGPIPE: 787 sat = &sigtable[6]; 788 break; 509 789 default: 510 790 return -EINVAL; … … 512 792 513 793 if (old != NULL) 514 memcpy(old, sat, sizeof(struct sigaction));515 516 memcpy(sat, sa, sizeof(struct sigaction));794 memcpy(old, sat, offsetof(struct k_sigaction, mask) + size); 795 796 memcpy(sat, sa, offsetof(struct k_sigaction, mask) + size); 517 797 518 798 return 0; … … 524 804 } 525 805 526 int stdio_close(struct _IO_FILE *fp) 527 { 528 return -EPERM; 529 } 530 531 size_t stdio_read(struct _IO_FILE *fp, unsigned char *data, size_t len) 532 { 533 return -EPERM; 534 } 535 536 size_t stdio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len) 537 { 538 return -EPERM; 539 } 540 541 size_t stdin_read(struct _IO_FILE *fp, unsigned char *data, size_t len) 542 { 543 int i = 0; 544 while (i < len) { 545 int c = ntstdio_getc(&ntstdio); 546 data[i++] = c; 547 if ((c == EOF) || (c == '\n')) 548 break; 549 } 550 return i; 551 } 552 553 size_t stdout_write(struct _IO_FILE *fp, const unsigned char *data, size_t len) 554 { 555 for (int i = 0; i < len; i++) { 556 ntstdio_putc(&ntstdio, data[i]); 557 } 558 return len; 559 } 560 561 size_t stderr_write(struct _IO_FILE *fp, const unsigned char *data, size_t len) 562 { 563 for (int i = 0; i < len; i++) { 564 ntstdio_putc(&ntstdio, data[i]); 565 } 566 return len; 567 } 568 569 int sio_close(struct _IO_FILE *fp) 570 { 571 return -EPERM; 572 } 573 574 size_t sio_read(struct _IO_FILE *fp, unsigned char *data, size_t len) 575 { 576 return -EPERM; 577 } 578 579 size_t sio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len) 580 { 581 return -EPERM; 582 } 583 584 off_t sio_seek(struct _IO_FILE *fp, off_t ofs, int org) 585 { 586 return -EPERM; 587 } 588 589 int sio_ioctl(struct _IO_FILE *fp, int request, void *arg) 590 { 591 switch (request) { 592 case TIOCGWINSZ: 806 int shell_gettid() 807 { 808 ID tskid; 809 ER ret; 810 811 ret = get_tid(&tskid); 812 if (ret != E_OK) 813 return -1; 814 815 return tskid; 816 } 817 818 int shell_tkill(int tid, int sig) 819 { 820 if ((tid == SHELLCMD_TASK) && (sig == SIGABRT)) { 821 shell_abort(); 822 } 823 824 no_implement("tkill"); 825 return -1; 826 } 827 828 int shell_kill(int pid, int sig) 829 { 830 DebugBreak(); 831 return -1; 832 } 833 834 int shell_gettimeofday(struct timeval *tv, void *tzvp) 835 { 836 SYSTIM time; 837 if (!tv) return 0; 838 get_tim(&time); 839 tv->tv_sec = time / 1000000; 840 tv->tv_usec = time - (tv->tv_sec * 1000000); 841 return 0; 842 } 843 844 int shell_nanosleep(const struct timespec *req, struct timespec *rem) 845 { 846 ER ret; 847 TMO tmo; 848 SYSTIM prev, now, diff; 849 850 if ((req == NULL) || (req->tv_nsec < 0) || (req->tv_nsec >= 1000000000)) 851 return -EINVAL; 852 853 get_tim(&prev); 854 855 tmo = req->tv_sec * 1000000 + req->tv_nsec / 1000; 856 ret = tslp_tsk(tmo); 857 if (ret == E_OK) { 858 if (rem != NULL) { 859 get_tim(&now); 860 diff = now - prev; 861 rem->tv_sec = diff / 1000000ll; 862 rem->tv_nsec = (diff - (rem->tv_sec * 1000000ll)) * 1000ll; 863 } 593 864 return 0; 594 case TCGETS: 595 return sio_tcgetattr(fp->fd, (struct termios *)arg); 596 case TCSETS + TCSANOW: 597 case TCSETS + TCSADRAIN: 598 case TCSETS + TCSAFLUSH: 599 return sio_tcsetattr(fp->fd, request - TCSETS, (const struct termios *)arg); 600 } 601 602 return -EINVAL; 603 } 604 865 } 866 else if (ret == E_TMOUT) { 867 if (rem != NULL) { 868 rem->tv_sec = 0; 869 rem->tv_nsec = 0; 870 } 871 return 0; 872 } 873 874 return -EFAULT; 875 } 876 877 ssize_t shell_getrandom(void *buf, size_t buflen, unsigned int flags) 878 { 879 SYSTIM now; 880 int32_t i; 881 int *output = (int *)buf; 882 size_t sz = buflen / 4; 883 884 get_tim(&now); 885 srand(now); 886 887 for (i = 0; i < sz; i++) 888 output[i] = rand(); 889 890 for (i = 4 * sz; i < buflen; i++) 891 ((char *)buf)[i] = rand(); 892 893 return buflen; 894 } 895 896 extern uint32_t __CmdBase; 897 extern uint32_t __CmdLimit; 898 899 void *shell_brk(void *addr) 900 { 901 if (addr == 0) { 902 return (void *)((intptr_t)&__CmdBase + 0x40000); 903 } 904 if ((addr >= (intptr_t)&__CmdBase + 0x40000) && (addr < &__CmdLimit)) { 905 return addr; 906 } 907 return (void *)-1; 908 } 909 910 void *shell_mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoffset) 911 { 912 if (fd != -1) 913 return -EINVAL; 914 915 if ((length >= 0) && (length <= (intptr_t)&__CmdLimit - ((intptr_t)&__CmdBase + 0x40000))) { 916 return &__CmdBase + 0x40000; 917 } 918 return (void *)-1; 919 } 920 921 int shell_mprotect(void *addr, size_t len, int prot) 922 { 923 //if ((addr >= (intptr_t)&__CmdBase + 0x40000) && ((intptr_t)addr + len < &__CmdLimit)) { 924 return 0; 925 //} 926 //return -1; 927 }
Note:
See TracChangeset
for help on using the changeset viewer.