| ... | ... | @@ -184,6 +184,26 @@ enum wasi_whence { |
| 184 | 184 | wasi_whence_end = 2, |
| 185 | 185 | }; |
| 186 | 186 | |
| 187 | extern uint16_t load16_align0(const uint8_t *ptr); |
| 188 | extern uint16_t load16_align1(const uint16_t *ptr); |
| 189 | extern uint32_t load32_align0(const uint8_t *ptr); |
| 190 | extern uint32_t load32_align1(const uint16_t *ptr); |
| 191 | extern uint32_t load32_align2(const uint32_t *ptr); |
| 192 | extern uint64_t load64_align0(const uint8_t *ptr); |
| 193 | extern uint64_t load64_align1(const uint16_t *ptr); |
| 194 | extern uint64_t load64_align2(const uint32_t *ptr); |
| 195 | extern uint64_t load64_align3(const uint64_t *ptr); |
| 196 | |
| 197 | extern void store16_align0(uint8_t *ptr, uint16_t val); |
| 198 | extern void store16_align1(uint16_t *ptr, uint16_t val); |
| 199 | extern void store32_align0(uint8_t *ptr, uint32_t val); |
| 200 | extern void store32_align1(uint16_t *ptr, uint32_t val); |
| 201 | extern void store32_align2(uint32_t *ptr, uint32_t val); |
| 202 | extern void store64_align0(uint8_t *ptr, uint64_t val); |
| 203 | extern void store64_align1(uint16_t *ptr, uint64_t val); |
| 204 | extern void store64_align2(uint32_t *ptr, uint64_t val); |
| 205 | extern void store64_align3(uint64_t *ptr, uint64_t val); |
| 206 | |
| 187 | 207 | extern uint8_t **const wasm_memory; |
| 188 | 208 | extern void wasm__start(void); |
| 189 | 209 | |
| ... | ... | @@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch |
| 362 | 382 | } |
| 363 | 383 | |
| 364 | 384 | static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) { |
| 365 | | res_filestat->dev = 0; |
| 366 | | res_filestat->ino = de; |
| 367 | | res_filestat->filetype = des[de].filetype; |
| 368 | | res_filestat->nlink = 1; |
| 369 | | res_filestat->size = 0; |
| 370 | | res_filestat->atim = des[de].atim * UINT64_C(1000000000); |
| 371 | | res_filestat->mtim = des[de].mtim * UINT64_C(1000000000); |
| 372 | | res_filestat->ctim = des[de].ctim * UINT64_C(1000000000); |
| 385 | store64_align3(&res_filestat->dev, 0); |
| 386 | store64_align3(&res_filestat->ino, de); |
| 387 | store64_align3(&res_filestat->filetype, des[de].filetype); |
| 388 | store64_align3(&res_filestat->nlink, 1); |
| 389 | store64_align3(&res_filestat->size, 0); |
| 390 | store64_align3(&res_filestat->atim, des[de].atim * UINT64_C(1000000000)); |
| 391 | store64_align3(&res_filestat->mtim, des[de].mtim * UINT64_C(1000000000)); |
| 392 | store64_align3(&res_filestat->ctim, des[de].ctim * UINT64_C(1000000000)); |
| 373 | 393 | } |
| 374 | 394 | |
| 375 | 395 | static void DirEntry_unlink(uint32_t de) { |
| ... | ... | @@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv |
| 394 | 414 | if (i == 1) continue; |
| 395 | 415 | size += strlen(c_argv[i]) + 1; |
| 396 | 416 | } |
| 397 | | *argv_size_ptr = c_argc - 1; |
| 398 | | *argv_buf_size_ptr = size; |
| 417 | store32_align2(argv_size_ptr, c_argc - 1); |
| 418 | store32_align2(argv_buf_size_ptr, size); |
| 399 | 419 | return wasi_errno_success; |
| 400 | 420 | } |
| 401 | 421 | |
| ... | ... | @@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) { |
| 413 | 433 | uint32_t argv_buf_i = 0; |
| 414 | 434 | for (int src_i = 0; src_i < c_argc; src_i += 1) { |
| 415 | 435 | if (src_i == 1) continue; |
| 416 | | argv_ptr[dst_i] = argv_buf + argv_buf_i; |
| 436 | store32_align2(&argv_ptr[dst_i], argv_buf + argv_buf_i); |
| 417 | 437 | dst_i += 1; |
| 418 | 438 | strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]); |
| 419 | 439 | argv_buf_i += strlen(c_argv[src_i]) + 1; |
| ... | ... | @@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat |
| 430 | 450 | |
| 431 | 451 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 432 | 452 | |
| 433 | | res_prestat_ptr[0] = 0; |
| 434 | | res_prestat_ptr[1] = strlen(des[fds[fd].de].guest_path); |
| 453 | store32_align2(&res_prestat_ptr[0], 0); |
| 454 | store32_align2(&res_prestat_ptr[1], strlen(des[fds[fd].de].guest_path)); |
| 435 | 455 | return wasi_errno_success; |
| 436 | 456 | } |
| 437 | 457 | |
| ... | ... | @@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path, |
| 443 | 463 | #endif |
| 444 | 464 | |
| 445 | 465 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 446 | | strncpy(path_ptr, des[fds[fd].de].guest_path, path_len); |
| 466 | strncpy(path_ptr, des[fds[fd].de].guest_path, path_len); |
| 447 | 467 | return wasi_errno_success; |
| 448 | 468 | } |
| 449 | 469 | |
| ... | ... | @@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov |
| 502 | 522 | |
| 503 | 523 | size_t size = 0; |
| 504 | 524 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| 525 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 505 | 526 | size_t read_size = 0; |
| 506 | 527 | if (fds[fd].stream != NULL) |
| 507 | | read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); |
| 528 | read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 508 | 529 | size += read_size; |
| 509 | | if (read_size < iovs_ptr[i].len) break; |
| 530 | if (read_size < len) break; |
| 510 | 531 | } |
| 511 | 532 | |
| 512 | 533 | if (size > 0) des[fds[fd].de].atim = time(NULL); |
| 513 | | *res_size_ptr = size; |
| 534 | store32_align2(res_size_ptr, size); |
| 514 | 535 | return wasi_errno_success; |
| 515 | 536 | } |
| 516 | 537 | |
| ... | ... | @@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest |
| 530 | 551 | if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io; |
| 531 | 552 | long size = ftell(fds[fd].stream); |
| 532 | 553 | if (size < 0) return wasi_errno_io; |
| 533 | | res_filestat_ptr->size = size; |
| 554 | store64_align3(&res_filestat_ptr->size, size); |
| 534 | 555 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| 535 | 556 | return wasi_errno_success; |
| 536 | 557 | } |
| ... | ... | @@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i |
| 617 | 638 | |
| 618 | 639 | size_t size = 0; |
| 619 | 640 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| 641 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 620 | 642 | size_t written_size = 0; |
| 621 | 643 | if (fds[fd].stream != NULL) |
| 622 | | written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); |
| 644 | written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 623 | 645 | else |
| 624 | | written_size = iovs_ptr[i].len; |
| 646 | written_size = len; |
| 625 | 647 | size += written_size; |
| 626 | | if (written_size < iovs_ptr[i].len) break; |
| 648 | if (written_size < len) break; |
| 627 | 649 | } |
| 628 | 650 | |
| 629 | 651 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| ... | ... | @@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i |
| 633 | 655 | des[fds[fd].de].atim = now; |
| 634 | 656 | des[fds[fd].de].mtim = now; |
| 635 | 657 | } |
| 636 | | *res_size_ptr = size; |
| 658 | store32_align2(res_size_ptr, size); |
| 637 | 659 | return wasi_errno_success; |
| 638 | 660 | } |
| 639 | 661 | |
| ... | ... | @@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_ |
| 669 | 691 | fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n"); |
| 670 | 692 | #endif |
| 671 | 693 | |
| 672 | | *environ_size_ptr = 0; |
| 673 | | *environ_buf_size_ptr = 0; |
| 694 | store32_align2(environ_size_ptr, 0); |
| 695 | store32_align2(environ_buf_size_ptr, 0); |
| 674 | 696 | return wasi_errno_success; |
| 675 | 697 | } |
| 676 | 698 | |
| ... | ... | @@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u |
| 702 | 724 | if (stream != NULL) { |
| 703 | 725 | if (fseek(stream, 0, SEEK_END) >= 0) { |
| 704 | 726 | long size = ftell(stream); |
| 705 | | if (size >= 0) res_filestat_ptr->size = size; |
| 727 | if (size >= 0) store64_align3(&res_filestat_ptr->size, size); |
| 706 | 728 | } |
| 707 | 729 | fclose(stream); |
| 708 | 730 | } |
| ... | ... | @@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat) |
| 718 | 740 | #endif |
| 719 | 741 | |
| 720 | 742 | if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf; |
| 721 | | res_fdstat_ptr->fs_filetype = des[fds[fd].de].filetype; |
| 722 | | res_fdstat_ptr->fs_flags = fds[fd].fdflags; |
| 723 | | res_fdstat_ptr->padding = 0; |
| 724 | | res_fdstat_ptr->fs_rights_inheriting = fds[fd].fs_rights_inheriting; |
| 743 | store16_align1(&res_fdstat_ptr->fs_filetype, des[fds[fd].de].filetype); |
| 744 | store16_align1(&res_fdstat_ptr->fs_flags, fds[fd].fdflags); |
| 745 | store32_align2(&res_fdstat_ptr->padding, 0); |
| 746 | store64_align3(&res_fdstat_ptr->fs_rights_inheriting, fds[fd].fs_rights_inheriting); |
| 725 | 747 | return wasi_errno_success; |
| 726 | 748 | } |
| 727 | 749 | |
| ... | ... | @@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io |
| 757 | 779 | |
| 758 | 780 | size_t size = 0; |
| 759 | 781 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| 782 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 760 | 783 | size_t written_size = 0; |
| 761 | 784 | if (fds[fd].stream != NULL) |
| 762 | | written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); |
| 785 | written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 763 | 786 | else |
| 764 | | written_size = iovs_ptr[i].len; |
| 787 | written_size = len; |
| 765 | 788 | size += written_size; |
| 766 | | if (written_size < iovs_ptr[i].len) break; |
| 789 | if (written_size < len) break; |
| 767 | 790 | } |
| 768 | 791 | |
| 769 | 792 | if (size > 0) { |
| ... | ... | @@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io |
| 771 | 794 | des[fds[fd].de].atim = now; |
| 772 | 795 | des[fds[fd].de].mtim = now; |
| 773 | 796 | } |
| 774 | | *res_size_ptr = size; |
| 797 | store32_align2(res_size_ptr, size); |
| 775 | 798 | return wasi_errno_success; |
| 776 | 799 | } |
| 777 | 800 | |
| ... | ... | @@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 809 | 832 | #if LOG_TRACE |
| 810 | 833 | fprintf(stderr, "fd = %u\n", fd_len); |
| 811 | 834 | #endif |
| 812 | | *res_fd_ptr = fd_len; |
| 835 | store32_align2(res_fd_ptr, fd_len); |
| 813 | 836 | fd_len += 1; |
| 814 | 837 | } |
| 815 | 838 | if (lookup_errno != wasi_errno_noent) return lookup_errno; |
| ... | ... | @@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32 |
| 867 | 890 | fds[fd_len].fdflags = fdflags; |
| 868 | 891 | fds[fd_len].stream = stream; |
| 869 | 892 | fds[fd_len].fs_rights_inheriting = fs_rights_inheriting; |
| 870 | | *res_fd_ptr = fd_len; |
| 893 | store32_align2(res_fd_ptr, fd_len); |
| 871 | 894 | fd_len += 1; |
| 872 | 895 | return wasi_errno_success; |
| 873 | 896 | } |
| ... | ... | @@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision, |
| 882 | 905 | |
| 883 | 906 | switch (id) { |
| 884 | 907 | case wasi_clockid_realtime: |
| 885 | | *res_timestamp_ptr = time(NULL) * UINT64_C(1000000000); |
| 908 | store64_align3(res_timestamp_ptr, time(NULL) * UINT64_C(1000000000)); |
| 886 | 909 | break; |
| 887 | 910 | case wasi_clockid_monotonic: |
| 888 | 911 | case wasi_clockid_process_cputime_id: |
| 889 | 912 | case wasi_clockid_thread_cputime_id: |
| 890 | | *res_timestamp_ptr = clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC); |
| 913 | store64_align3(res_timestamp_ptr, clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC)); |
| 891 | 914 | break; |
| 892 | 915 | default: return wasi_errno_inval; |
| 893 | 916 | } |
| ... | ... | @@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io |
| 947 | 970 | |
| 948 | 971 | size_t size = 0; |
| 949 | 972 | for (uint32_t i = 0; i < iovs_len; i += 1) { |
| 973 | uint32_t len = load32_align2(&iovs_ptr[i].len); |
| 950 | 974 | size_t read_size = 0; |
| 951 | 975 | if (fds[fd].stream != NULL) |
| 952 | | read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream); |
| 976 | read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); |
| 953 | 977 | else |
| 954 | 978 | panic("unimplemented"); |
| 955 | 979 | size += read_size; |
| 956 | | if (read_size < iovs_ptr[i].len) break; |
| 980 | if (read_size < len) break; |
| 957 | 981 | } |
| 958 | 982 | |
| 959 | 983 | if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; |
| 960 | 984 | |
| 961 | 985 | if (size > 0) des[fds[fd].de].atim = time(NULL); |
| 962 | | *res_size_ptr = size; |
| 986 | store32_align2(res_size_ptr, size); |
| 963 | 987 | return wasi_errno_success; |
| 964 | 988 | } |
| 965 | 989 | |
| ... | ... | @@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_ |
| 996 | 1020 | if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io; |
| 997 | 1021 | long res_offset = ftell(fds[fd].stream); |
| 998 | 1022 | if (res_offset < 0) return wasi_errno_io; |
| 999 | | *res_filesize_ptr = (uint64_t)res_offset; |
| 1023 | store64_align3(res_filesize_ptr, res_offset); |
| 1000 | 1024 | return wasi_errno_success; |
| 1001 | 1025 | } |
| 1002 | 1026 | |