Skip to content

Instantly share code, notes, and snippets.

@lupyuen
Created February 10, 2024 02:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lupyuen/837184772dd091a83f2c61ec357a3d1d to your computer and use it in GitHub Desktop.
Save lupyuen/837184772dd091a83f2c61ec357a3d1d to your computer and use it in GitHub Desktop.
TCC WebAssembly: ROM FS Filesystem Hex Dump. See https://github.com/lupyuen/tcc-riscv32-wasm
$ hexdump -C tcc-riscv32-wasm/zig/romfs.bin
00000000 2d 72 6f 6d 31 66 73 2d 00 00 0f 90 58 57 01 f8 |-rom1fs-....XW..|
00000010 52 4f 4d 46 53 00 00 00 00 00 00 00 00 00 00 00 |ROMFS...........|
00000020 00 00 00 49 00 00 00 20 00 00 00 00 d1 ff ff 97 |...I... ........|
00000030 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 60 00 00 00 20 00 00 00 00 d1 d1 ff 80 |...`... ........|
00000050 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 0a 42 00 00 00 00 00 00 09 b7 1d 5d 1f 9e |...B.........]..|
00000070 73 74 64 69 6f 2e 68 00 00 00 00 00 00 00 00 00 |stdio.h.........|
00000080 2f 2f 20 43 61 75 74 69 6f 6e 3a 20 54 68 69 73 |// Caution: This|
00000090 20 6d 61 79 20 63 68 61 6e 67 65 0a 23 64 65 66 | may change.#def|
000000a0 69 6e 65 20 53 59 53 5f 77 72 69 74 65 20 36 31 |ine SYS_write 61|
000000b0 0a 0a 2f 2f 20 54 4f 44 4f 3a 20 4d 6f 76 65 20 |..// TODO: Move |
000000c0 74 68 69 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e |this to a common|
000000d0 20 66 69 6c 65 0a 74 79 70 65 64 65 66 20 69 6e | file.typedef in|
000000e0 74 20 73 69 7a 65 5f 74 3b 0a 74 79 70 65 64 65 |t size_t;.typede|
000000f0 66 20 69 6e 74 20 73 73 69 7a 65 5f 74 3b 0a 74 |f int ssize_t;.t|
00000100 79 70 65 64 65 66 20 69 6e 74 20 75 69 6e 74 70 |ypedef int uintp|
00000110 74 72 5f 74 3b 0a 0a 2f 2f 20 52 65 74 75 72 6e |tr_t;..// Return|
00000120 20 74 68 65 20 73 74 72 69 6e 67 20 6c 65 6e 67 | the string leng|
00000130 74 68 0a 69 6e 6c 69 6e 65 20 73 69 7a 65 5f 74 |th.inline size_t|
00000140 20 73 74 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 | strlen(const ch|
00000150 61 72 20 2a 73 29 20 7b 0a 20 20 73 69 7a 65 5f |ar *s) {. size_|
00000160 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 77 68 69 |t len = 0;. whi|
00000170 6c 65 20 28 2a 73 20 21 3d 20 30 29 20 7b 0a 20 |le (*s != 0) {. |
00000180 20 20 20 73 2b 2b 3b 0a 20 20 20 20 6c 65 6e 2b | s++;. len+|
00000190 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 |+;. }. return |
000001a0 6c 65 6e 3b 0a 7d 0a 0a 2f 2f 20 50 72 69 6e 74 |len;.}..// Print|
000001b0 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 53 | the string to S|
000001c0 74 61 6e 64 61 72 64 20 4f 75 74 70 75 74 0a 69 |tandard Output.i|
000001d0 6e 6c 69 6e 65 20 69 6e 74 20 70 75 74 73 28 63 |nline int puts(c|
000001e0 6f 6e 73 74 20 63 68 61 72 20 2a 73 29 20 7b 0a |onst char *s) {.|
000001f0 20 20 72 65 74 75 72 6e 0a 20 20 20 20 77 72 69 | return. wri|
00000200 74 65 28 31 2c 20 73 2c 20 73 74 72 6c 65 6e 28 |te(1, s, strlen(|
00000210 73 29 29 20 2b 0a 20 20 20 20 77 72 69 74 65 28 |s)) +. write(|
00000220 31 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 7d 0a 0a |1, "\n", 1);.}..|
00000230 2f 2f 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 |// Write to the |
00000240 46 69 6c 65 20 44 65 73 63 72 69 70 74 6f 72 0a |File Descriptor.|
00000250 2f 2f 20 68 74 74 70 73 3a 2f 2f 6c 75 70 79 75 |// https://lupyu|
00000260 65 6e 2e 67 69 74 68 75 62 2e 69 6f 2f 61 72 74 |en.github.io/art|
00000270 69 63 6c 65 73 2f 61 70 70 23 6e 75 74 74 78 2d |icles/app#nuttx-|
00000280 61 70 70 2d 63 61 6c 6c 73 2d 6e 75 74 74 78 2d |app-calls-nuttx-|
00000290 6b 65 72 6e 65 6c 0a 69 6e 6c 69 6e 65 20 73 73 |kernel.inline ss|
000002a0 69 7a 65 5f 74 20 77 72 69 74 65 28 69 6e 74 20 |ize_t write(int |
000002b0 70 61 72 6d 31 2c 20 63 6f 6e 73 74 20 76 6f 69 |parm1, const voi|
000002c0 64 20 2a 20 70 61 72 6d 32 2c 20 73 69 7a 65 5f |d * parm2, size_|
000002d0 74 20 70 61 72 6d 33 29 20 7b 0a 20 20 72 65 74 |t parm3) {. ret|
000002e0 75 72 6e 20 28 73 73 69 7a 65 5f 74 29 20 73 79 |urn (ssize_t) sy|
000002f0 73 5f 63 61 6c 6c 33 28 0a 20 20 20 20 28 75 6e |s_call3(. (un|
00000300 73 69 67 6e 65 64 20 69 6e 74 29 20 53 59 53 5f |signed int) SYS_|
00000310 77 72 69 74 65 2c 20 20 2f 2f 20 53 79 73 74 65 |write, // Syste|
00000320 6d 20 43 61 6c 6c 20 4e 75 6d 62 65 72 0a 20 20 |m Call Number. |
00000330 20 20 28 75 69 6e 74 70 74 72 5f 74 29 20 70 61 | (uintptr_t) pa|
00000340 72 6d 31 2c 20 20 20 20 20 20 20 20 20 2f 2f 20 |rm1, // |
00000350 46 69 6c 65 20 44 65 73 63 72 69 70 74 6f 72 20 |File Descriptor |
00000360 28 31 20 3d 20 53 74 61 6e 64 61 72 64 20 4f 75 |(1 = Standard Ou|
00000370 74 70 75 74 29 0a 20 20 20 20 28 75 69 6e 74 70 |tput). (uintp|
00000380 74 72 5f 74 29 20 70 61 72 6d 32 2c 20 20 20 20 |tr_t) parm2, |
00000390 20 20 20 20 20 2f 2f 20 42 75 66 66 65 72 20 74 | // Buffer t|
000003a0 6f 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 |o be written. |
000003b0 20 28 75 69 6e 74 70 74 72 5f 74 29 20 70 61 72 | (uintptr_t) par|
000003c0 6d 33 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e |m3 // N|
000003d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 |umber of bytes t|
000003e0 6f 20 77 72 69 74 65 0a 20 20 29 3b 0a 7d 0a 0a |o write. );.}..|
000003f0 2f 2f 20 4d 61 6b 65 20 61 20 53 79 73 74 65 6d |// Make a System|
00000400 20 43 61 6c 6c 20 77 69 74 68 20 33 20 70 61 72 | Call with 3 par|
00000410 61 6d 65 74 65 72 73 0a 2f 2f 20 68 74 74 70 73 |ameters.// https|
00000420 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 61 70 |://github.com/ap|
00000430 61 63 68 65 2f 6e 75 74 74 78 2f 62 6c 6f 62 2f |ache/nuttx/blob/|
00000440 6d 61 73 74 65 72 2f 61 72 63 68 2f 72 69 73 63 |master/arch/risc|
00000450 2d 76 2f 69 6e 63 6c 75 64 65 2f 73 79 73 63 61 |-v/include/sysca|
00000460 6c 6c 2e 68 23 4c 32 34 30 2d 4c 32 36 38 0a 69 |ll.h#L240-L268.i|
00000470 6e 6c 69 6e 65 20 75 69 6e 74 70 74 72 5f 74 20 |nline uintptr_t |
00000480 73 79 73 5f 63 61 6c 6c 33 28 0a 20 20 75 6e 73 |sys_call3(. uns|
00000490 69 67 6e 65 64 20 69 6e 74 20 6e 62 72 2c 20 20 |igned int nbr, |
000004a0 2f 2f 20 53 79 73 74 65 6d 20 43 61 6c 6c 20 4e |// System Call N|
000004b0 75 6d 62 65 72 0a 20 20 75 69 6e 74 70 74 72 5f |umber. uintptr_|
000004c0 74 20 70 61 72 6d 31 2c 20 20 20 2f 2f 20 46 69 |t parm1, // Fi|
000004d0 72 73 74 20 50 61 72 61 6d 65 74 65 72 0a 20 20 |rst Parameter. |
000004e0 75 69 6e 74 70 74 72 5f 74 20 70 61 72 6d 32 2c |uintptr_t parm2,|
000004f0 20 20 20 2f 2f 20 53 65 63 6f 6e 64 20 50 61 72 | // Second Par|
00000500 61 6d 65 74 65 72 0a 20 20 75 69 6e 74 70 74 72 |ameter. uintptr|
00000510 5f 74 20 70 61 72 6d 33 20 20 20 20 2f 2f 20 54 |_t parm3 // T|
00000520 68 69 72 64 20 50 61 72 61 6d 65 74 65 72 0a 29 |hird Parameter.)|
00000530 20 7b 0a 20 20 2f 2f 20 50 61 73 73 20 74 68 65 | {. // Pass the|
00000540 20 46 75 6e 63 74 69 6f 6e 20 4e 75 6d 62 65 72 | Function Number|
00000550 20 61 6e 64 20 50 61 72 61 6d 65 74 65 72 73 20 | and Parameters |
00000560 69 6e 0a 20 20 2f 2f 20 52 65 67 69 73 74 65 72 |in. // Register|
00000570 73 20 41 30 20 74 6f 20 41 33 0a 20 20 72 65 67 |s A0 to A3. reg|
00000580 69 73 74 65 72 20 6c 6f 6e 67 20 72 33 20 61 73 |ister long r3 as|
00000590 6d 28 22 61 30 22 29 20 3d 20 28 6c 6f 6e 67 29 |m("a0") = (long)|
000005a0 28 70 61 72 6d 33 29 3b 20 20 2f 2f 20 57 69 6c |(parm3); // Wil|
000005b0 6c 20 6d 6f 76 65 20 74 6f 20 41 33 0a 20 20 61 |l move to A3. a|
000005c0 73 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 73 6c |sm volatile ("sl|
000005d0 6c 69 20 61 33 2c 20 61 30 2c 20 33 32 22 29 3b |li a3, a0, 32");|
000005e0 20 20 2f 2f 20 53 68 69 66 74 20 33 32 20 62 69 | // Shift 32 bi|
000005f0 74 73 20 4c 65 66 74 20 74 68 65 6e 20 52 69 67 |ts Left then Rig|
00000600 68 74 0a 20 20 61 73 6d 20 76 6f 6c 61 74 69 6c |ht. asm volatil|
00000610 65 20 28 22 73 72 6c 69 20 61 33 2c 20 61 33 2c |e ("srli a3, a3,|
00000620 20 33 32 22 29 3b 20 20 2f 2f 20 54 6f 20 63 6c | 32"); // To cl|
00000630 65 61 72 20 74 68 65 20 74 6f 70 20 33 32 20 62 |ear the top 32 b|
00000640 69 74 73 0a 0a 20 20 72 65 67 69 73 74 65 72 20 |its.. register |
00000650 6c 6f 6e 67 20 72 32 20 61 73 6d 28 22 61 30 22 |long r2 asm("a0"|
00000660 29 20 3d 20 28 6c 6f 6e 67 29 28 70 61 72 6d 32 |) = (long)(parm2|
00000670 29 3b 20 20 2f 2f 20 57 69 6c 6c 20 6d 6f 76 65 |); // Will move|
00000680 20 74 6f 20 41 32 0a 20 20 61 73 6d 20 76 6f 6c | to A2. asm vol|
00000690 61 74 69 6c 65 20 28 22 73 6c 6c 69 20 61 32 2c |atile ("slli a2,|
000006a0 20 61 30 2c 20 33 32 22 29 3b 20 20 2f 2f 20 53 | a0, 32"); // S|
000006b0 68 69 66 74 20 33 32 20 62 69 74 73 20 4c 65 66 |hift 32 bits Lef|
000006c0 74 20 74 68 65 6e 20 52 69 67 68 74 0a 20 20 61 |t then Right. a|
000006d0 73 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 73 72 |sm volatile ("sr|
000006e0 6c 69 20 61 32 2c 20 61 32 2c 20 33 32 22 29 3b |li a2, a2, 32");|
000006f0 20 20 2f 2f 20 54 6f 20 63 6c 65 61 72 20 74 68 | // To clear th|
00000700 65 20 74 6f 70 20 33 32 20 62 69 74 73 0a 0a 20 |e top 32 bits.. |
00000710 20 72 65 67 69 73 74 65 72 20 6c 6f 6e 67 20 72 | register long r|
00000720 31 20 61 73 6d 28 22 61 30 22 29 20 3d 20 28 6c |1 asm("a0") = (l|
00000730 6f 6e 67 29 28 70 61 72 6d 31 29 3b 20 20 2f 2f |ong)(parm1); //|
00000740 20 57 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 41 31 | Will move to A1|
00000750 0a 20 20 61 73 6d 20 76 6f 6c 61 74 69 6c 65 20 |. asm volatile |
00000760 28 22 73 6c 6c 69 20 61 31 2c 20 61 30 2c 20 33 |("slli a1, a0, 3|
00000770 32 22 29 3b 20 20 2f 2f 20 53 68 69 66 74 20 33 |2"); // Shift 3|
00000780 32 20 62 69 74 73 20 4c 65 66 74 20 74 68 65 6e |2 bits Left then|
00000790 20 52 69 67 68 74 0a 20 20 61 73 6d 20 76 6f 6c | Right. asm vol|
000007a0 61 74 69 6c 65 20 28 22 73 72 6c 69 20 61 31 2c |atile ("srli a1,|
000007b0 20 61 31 2c 20 33 32 22 29 3b 20 20 2f 2f 20 54 | a1, 32"); // T|
000007c0 6f 20 63 6c 65 61 72 20 74 68 65 20 74 6f 70 20 |o clear the top |
000007d0 33 32 20 62 69 74 73 0a 0a 20 20 72 65 67 69 73 |32 bits.. regis|
000007e0 74 65 72 20 6c 6f 6e 67 20 72 30 20 61 73 6d 28 |ter long r0 asm(|
000007f0 22 61 30 22 29 20 3d 20 28 6c 6f 6e 67 29 28 6e |"a0") = (long)(n|
00000800 62 72 29 3b 20 20 2f 2f 20 57 69 6c 6c 20 73 74 |br); // Will st|
00000810 61 79 20 69 6e 20 41 30 0a 0a 20 20 2f 2f 20 60 |ay in A0.. // `|
00000820 65 63 61 6c 6c 60 20 77 69 6c 6c 20 6a 75 6d 70 |ecall` will jump|
00000830 20 66 72 6f 6d 20 52 49 53 43 2d 56 20 55 73 65 | from RISC-V Use|
00000840 72 20 4d 6f 64 65 0a 20 20 2f 2f 20 74 6f 20 52 |r Mode. // to R|
00000850 49 53 43 2d 56 20 53 75 70 65 72 76 69 73 6f 72 |ISC-V Supervisor|
00000860 20 4d 6f 64 65 0a 20 20 2f 2f 20 74 6f 20 65 78 | Mode. // to ex|
00000870 65 63 75 74 65 20 74 68 65 20 53 79 73 74 65 6d |ecute the System|
00000880 20 43 61 6c 6c 2e 0a 20 20 2f 2f 20 49 6e 70 75 | Call.. // Inpu|
00000890 74 20 2b 20 4f 75 74 70 75 74 20 52 65 67 69 73 |t + Output Regis|
000008a0 74 65 72 73 3a 20 41 30 20 74 6f 20 41 33 0a 20 |ters: A0 to A3. |
000008b0 20 2f 2f 20 43 6c 6f 62 62 65 72 73 20 74 68 65 | // Clobbers the|
000008c0 20 4d 65 6d 6f 72 79 0a 20 20 61 73 6d 20 76 6f | Memory. asm vo|
000008d0 6c 61 74 69 6c 65 0a 20 20 28 0a 20 20 20 20 2f |latile. (. /|
000008e0 2f 20 45 43 41 4c 4c 20 66 6f 72 20 53 79 73 74 |/ ECALL for Syst|
000008f0 65 6d 20 43 61 6c 6c 20 74 6f 20 4e 75 74 74 58 |em Call to NuttX|
00000900 20 4b 65 72 6e 65 6c 0a 20 20 20 20 22 65 63 61 | Kernel. "eca|
00000910 6c 6c 20 5c 6e 22 0a 20 20 20 20 0a 20 20 20 20 |ll \n". . |
00000920 2f 2f 20 4e 75 74 74 58 20 6e 65 65 64 73 20 4e |// NuttX needs N|
00000930 4f 50 20 61 66 74 65 72 20 45 43 41 4c 4c 0a 20 |OP after ECALL. |
00000940 20 20 20 22 2e 77 6f 72 64 20 30 78 30 30 30 31 | ".word 0x0001|
00000950 20 5c 6e 22 0a 0a 20 20 20 20 2f 2f 20 49 6e 70 | \n".. // Inp|
00000960 75 74 2b 4f 75 74 70 75 74 20 52 65 67 69 73 74 |ut+Output Regist|
00000970 65 72 73 3a 20 4e 6f 6e 65 0a 20 20 20 20 2f 2f |ers: None. //|
00000980 20 49 6e 70 75 74 2d 4f 6e 6c 79 20 52 65 67 69 | Input-Only Regi|
00000990 73 74 65 72 73 3a 20 41 30 20 74 6f 20 41 33 0a |sters: A0 to A3.|
000009a0 20 20 20 20 2f 2f 20 43 6c 6f 62 62 65 72 73 20 | // Clobbers |
000009b0 74 68 65 20 4d 65 6d 6f 72 79 0a 20 20 20 20 3a |the Memory. :|
000009c0 0a 20 20 20 20 3a 20 22 72 22 28 72 30 29 2c 20 |. : "r"(r0), |
000009d0 22 72 22 28 72 31 29 2c 20 22 72 22 28 72 32 29 |"r"(r1), "r"(r2)|
000009e0 2c 20 22 72 22 28 72 33 29 0a 20 20 20 20 3a 20 |, "r"(r3). : |
000009f0 22 6d 65 6d 6f 72 79 22 0a 20 20 29 3b 0a 0a 20 |"memory". );.. |
00000a00 20 2f 2f 20 52 65 74 75 72 6e 20 74 68 65 20 72 | // Return the r|
00000a10 65 73 75 6c 74 20 66 72 6f 6d 20 52 65 67 69 73 |esult from Regis|
00000a20 74 65 72 20 41 30 0a 20 20 72 65 74 75 72 6e 20 |ter A0. return |
00000a30 72 30 3b 0a 7d 20 0a 00 00 00 00 00 00 00 00 00 |r0;.} ..........|
00000a40 00 00 00 02 00 00 00 00 00 00 05 2e 23 29 67 fc |............#)g.|
00000a50 73 74 64 6c 69 62 2e 68 00 00 00 00 00 00 00 00 |stdlib.h........|
00000a60 2f 2f 20 43 61 75 74 69 6f 6e 3a 20 54 68 69 73 |// Caution: This|
00000a70 20 6d 61 79 20 63 68 61 6e 67 65 0a 23 64 65 66 | may change.#def|
00000a80 69 6e 65 20 53 59 53 5f 5f 65 78 69 74 20 38 0a |ine SYS__exit 8.|
00000a90 0a 2f 2f 20 54 65 72 6d 69 6e 61 74 65 20 74 68 |.// Terminate th|
00000aa0 65 20 4e 75 74 74 58 20 50 72 6f 63 65 73 73 0a |e NuttX Process.|
00000ab0 2f 2f 20 46 72 6f 6d 20 6e 75 74 74 78 2f 73 79 |// From nuttx/sy|
00000ac0 73 63 61 6c 6c 2f 70 72 6f 78 69 65 73 2f 50 52 |scall/proxies/PR|
00000ad0 4f 58 59 5f 5f 65 78 69 74 2e 63 0a 69 6e 6c 69 |OXY__exit.c.inli|
00000ae0 6e 65 20 76 6f 69 64 20 65 78 69 74 28 69 6e 74 |ne void exit(int|
00000af0 20 70 61 72 6d 31 29 20 7b 0a 20 20 73 79 73 5f | parm1) {. sys_|
00000b00 63 61 6c 6c 31 28 28 75 6e 73 69 67 6e 65 64 20 |call1((unsigned |
00000b10 69 6e 74 29 53 59 53 5f 5f 65 78 69 74 2c 20 28 |int)SYS__exit, (|
00000b20 75 69 6e 74 70 74 72 5f 74 29 70 61 72 6d 31 29 |uintptr_t)parm1)|
00000b30 3b 0a 20 20 77 68 69 6c 65 28 31 29 3b 0a 7d 0a |;. while(1);.}.|
00000b40 0a 2f 2f 20 4d 61 6b 65 20 61 20 53 79 73 74 65 |.// Make a Syste|
00000b50 6d 20 43 61 6c 6c 20 77 69 74 68 20 31 20 70 61 |m Call with 1 pa|
00000b60 72 61 6d 65 74 65 72 73 0a 2f 2f 20 68 74 74 70 |rameters.// http|
00000b70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 61 |s://github.com/a|
00000b80 70 61 63 68 65 2f 6e 75 74 74 78 2f 62 6c 6f 62 |pache/nuttx/blob|
00000b90 2f 6d 61 73 74 65 72 2f 61 72 63 68 2f 72 69 73 |/master/arch/ris|
00000ba0 63 2d 76 2f 69 6e 63 6c 75 64 65 2f 73 79 73 63 |c-v/include/sysc|
00000bb0 61 6c 6c 2e 68 23 4c 31 38 38 2d 4c 32 31 33 0a |all.h#L188-L213.|
00000bc0 69 6e 6c 69 6e 65 20 75 69 6e 74 70 74 72 5f 74 |inline uintptr_t|
00000bd0 20 73 79 73 5f 63 61 6c 6c 31 28 0a 20 20 75 6e | sys_call1(. un|
00000be0 73 69 67 6e 65 64 20 69 6e 74 20 6e 62 72 2c 20 |signed int nbr, |
00000bf0 20 2f 2f 20 53 79 73 74 65 6d 20 43 61 6c 6c 20 | // System Call |
00000c00 4e 75 6d 62 65 72 0a 20 20 75 69 6e 74 70 74 72 |Number. uintptr|
00000c10 5f 74 20 70 61 72 6d 31 20 20 20 20 2f 2f 20 46 |_t parm1 // F|
00000c20 69 72 73 74 20 50 61 72 61 6d 65 74 65 72 0a 29 |irst Parameter.)|
00000c30 20 7b 0a 20 20 2f 2f 20 50 61 73 73 20 74 68 65 | {. // Pass the|
00000c40 20 46 75 6e 63 74 69 6f 6e 20 4e 75 6d 62 65 72 | Function Number|
00000c50 20 61 6e 64 20 50 61 72 61 6d 65 74 65 72 73 0a | and Parameters.|
00000c60 20 20 2f 2f 20 52 65 67 69 73 74 65 72 73 20 41 | // Registers A|
00000c70 30 20 74 6f 20 41 31 0a 20 20 72 65 67 69 73 74 |0 to A1. regist|
00000c80 65 72 20 6c 6f 6e 67 20 72 31 20 61 73 6d 28 22 |er long r1 asm("|
00000c90 61 30 22 29 20 3d 20 28 6c 6f 6e 67 29 28 70 61 |a0") = (long)(pa|
00000ca0 72 6d 31 29 3b 20 20 2f 2f 20 57 69 6c 6c 20 6d |rm1); // Will m|
00000cb0 6f 76 65 20 74 6f 20 41 31 0a 20 20 61 73 6d 20 |ove to A1. asm |
00000cc0 76 6f 6c 61 74 69 6c 65 20 28 22 73 6c 6c 69 20 |volatile ("slli |
00000cd0 61 31 2c 20 61 30 2c 20 33 32 22 29 3b 20 20 2f |a1, a0, 32"); /|
00000ce0 2f 20 53 68 69 66 74 20 33 32 20 62 69 74 73 20 |/ Shift 32 bits |
00000cf0 4c 65 66 74 20 74 68 65 6e 20 52 69 67 68 74 0a |Left then Right.|
00000d00 20 20 61 73 6d 20 76 6f 6c 61 74 69 6c 65 20 28 | asm volatile (|
00000d10 22 73 72 6c 69 20 61 31 2c 20 61 31 2c 20 33 32 |"srli a1, a1, 32|
00000d20 22 29 3b 20 20 2f 2f 20 54 6f 20 63 6c 65 61 72 |"); // To clear|
00000d30 20 74 68 65 20 74 6f 70 20 33 32 20 62 69 74 73 | the top 32 bits|
00000d40 0a 0a 20 20 72 65 67 69 73 74 65 72 20 6c 6f 6e |.. register lon|
00000d50 67 20 72 30 20 61 73 6d 28 22 61 30 22 29 20 3d |g r0 asm("a0") =|
00000d60 20 28 6c 6f 6e 67 29 28 6e 62 72 29 3b 20 20 2f | (long)(nbr); /|
00000d70 2f 20 57 69 6c 6c 20 73 74 61 79 20 69 6e 20 41 |/ Will stay in A|
00000d80 30 0a 0a 20 20 2f 2f 20 60 65 63 61 6c 6c 60 20 |0.. // `ecall` |
00000d90 77 69 6c 6c 20 6a 75 6d 70 20 66 72 6f 6d 20 52 |will jump from R|
00000da0 49 53 43 2d 56 20 55 73 65 72 20 4d 6f 64 65 0a |ISC-V User Mode.|
00000db0 20 20 2f 2f 20 74 6f 20 52 49 53 43 2d 56 20 53 | // to RISC-V S|
00000dc0 75 70 65 72 76 69 73 6f 72 20 4d 6f 64 65 0a 20 |upervisor Mode. |
00000dd0 20 2f 2f 20 74 6f 20 65 78 65 63 75 74 65 20 74 | // to execute t|
00000de0 68 65 20 53 79 73 74 65 6d 20 43 61 6c 6c 2e 0a |he System Call..|
00000df0 20 20 2f 2f 20 49 6e 70 75 74 20 2b 20 4f 75 74 | // Input + Out|
00000e00 70 75 74 20 52 65 67 69 73 74 65 72 73 3a 20 41 |put Registers: A|
00000e10 30 20 74 6f 20 41 31 0a 20 20 2f 2f 20 43 6c 6f |0 to A1. // Clo|
00000e20 62 62 65 72 73 20 74 68 65 20 4d 65 6d 6f 72 79 |bbers the Memory|
00000e30 0a 20 20 61 73 6d 20 76 6f 6c 61 74 69 6c 65 0a |. asm volatile.|
00000e40 20 20 28 0a 20 20 20 20 2f 2f 20 45 43 41 4c 4c | (. // ECALL|
00000e50 20 66 6f 72 20 53 79 73 74 65 6d 20 43 61 6c 6c | for System Call|
00000e60 20 74 6f 20 4e 75 74 74 58 20 4b 65 72 6e 65 6c | to NuttX Kernel|
00000e70 0a 20 20 20 20 22 65 63 61 6c 6c 20 5c 6e 22 0a |. "ecall \n".|
00000e80 20 20 20 20 0a 20 20 20 20 2f 2f 20 4e 75 74 74 | . // Nutt|
00000e90 58 20 6e 65 65 64 73 20 4e 4f 50 20 61 66 74 65 |X needs NOP afte|
00000ea0 72 20 45 43 41 4c 4c 0a 20 20 20 20 22 2e 77 6f |r ECALL. ".wo|
00000eb0 72 64 20 30 78 30 30 30 31 20 5c 6e 22 0a 0a 20 |rd 0x0001 \n".. |
00000ec0 20 20 20 2f 2f 20 49 6e 70 75 74 2b 4f 75 74 70 | // Input+Outp|
00000ed0 75 74 20 52 65 67 69 73 74 65 72 73 3a 20 4e 6f |ut Registers: No|
00000ee0 6e 65 0a 20 20 20 20 2f 2f 20 49 6e 70 75 74 2d |ne. // Input-|
00000ef0 4f 6e 6c 79 20 52 65 67 69 73 74 65 72 73 3a 20 |Only Registers: |
00000f00 41 30 20 74 6f 20 41 31 0a 20 20 20 20 2f 2f 20 |A0 to A1. // |
00000f10 43 6c 6f 62 62 65 72 73 20 74 68 65 20 4d 65 6d |Clobbers the Mem|
00000f20 6f 72 79 0a 20 20 20 20 3a 0a 20 20 20 20 3a 20 |ory. :. : |
00000f30 22 72 22 28 72 30 29 2c 20 22 72 22 28 72 31 29 |"r"(r0), "r"(r1)|
00000f40 0a 20 20 20 20 3a 20 22 6d 65 6d 6f 72 79 22 0a |. : "memory".|
00000f50 20 20 29 3b 0a 0a 20 20 2f 2f 20 52 65 74 75 72 | );.. // Retur|
00000f60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f |n the result fro|
00000f70 6d 20 52 65 67 69 73 74 65 72 20 41 30 0a 20 20 |m Register A0. |
00000f80 72 65 74 75 72 6e 20 72 30 3b 0a 7d 20 0a 00 00 |return r0;.} ...|
00000f90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment