@@ -24,26 +24,43 @@ fn sys_write(fd: u32, data: []const u8) void {
2424 );
2525}
2626
27- fn sys_read (fd : u32 , comptime nrequested : usize , buffer : []u8 ) void {
27+ fn sys_read (fd : u32 , nrequested : usize , buffer : []u8 , nread : * u32 , last : * u32 ) void {
2828 const main_words = nrequested / 4 ;
2929
3030 const syscall_name : [:0 ]const u8 = "risc0_zkvm_platform::syscall::nr::SYS_READ" ;
31+ var a0 : u32 = undefined ;
32+ var a1 : u32 = undefined ;
3133 asm volatile (
3234 \\ ecall
33- :
35+ : [a0 ] "={a0}" (a0 ),
36+ [a1 ] "={a1}" (a1 ),
3437 : [syscallNumber ] "{t0}" (syscalls .software ),
35- [from_host ] "{a0}" (buffer ),
38+ [from_host ] "{a0}" (buffer . ptr ),
3639 [from_host_words ] "{a1}" (main_words ),
3740 [syscall_name ] "{a2}" (syscall_name .ptr ),
3841 [file_descriptor ] "{a3}" (fd ),
3942 [main_requested ] "{a4}" (nrequested ),
4043 : "memory"
4144 );
45+
46+ nread .* = a0 ;
47+ last .* = a1 ;
4248}
4349
44- pub fn read_slice (_ : u32 , data : []u32 ) void {
45- var as_u8 : []u8 = @ptrCast (data );
46- read_slice (.stdin , as_u8 [0.. ]);
50+ pub fn read_slice (fd : u32 , data : []u8 ) void {
51+ var count : u32 = 0 ;
52+ // TODO unaligned read if needed for starting point
53+ while (count < data .len ) {
54+ const chunk_len = @min (data .len , 1024 * 4 );
55+ var nread : u32 = undefined ;
56+ var last : u32 = 0 ;
57+ sys_read (fd , chunk_len , data [count .. ], & nread , & last );
58+ if (nread == 0 ) print_str ("read 0\n " );
59+ if (last == 0 ) print_str ("last 0\n " );
60+ if (nread < chunk_len ) break ;
61+ count += nread ;
62+ }
63+ // TODO unaligned read at the end if need be
4764}
4865
4966pub fn write_slice (fd : u32 , data : []const u8 ) void {
0 commit comments