Skip to content

Commit 3e3b72c

Browse files
committed
Implement writev syscall in stdio
musl actually uses writev instead of write syscall to print to stdout. Adding this new syscall implementation makes ckb-debugger nicer to musl. Note that musl actually issues ioctl before issuing writev syscall as well, however, ioctl is one messy component, it might be better that we keep it simple so the debugger only handles writev for now. We can hijack ioctl like we do now in musl.
1 parent 52d6b72 commit 3e3b72c

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

ckb-vm-debug-utils/src/stdio.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,31 @@ impl Stdio {
147147
machine.set_register(A0, Mac::REG::from_u64(ret as u64));
148148
Ok(())
149149
}
150+
151+
fn writev<Mac: SupportMachine>(&mut self, machine: &mut Mac) -> Result<(), Error> {
152+
let fd = machine.registers()[A0].to_i32();
153+
let iov = machine.registers()[A1].to_u64();
154+
let iovcnt = machine.registers()[A2].to_u64();
155+
156+
let mut written = 0;
157+
for i in 0..iovcnt {
158+
let base = machine.memory_mut().load64(&Mac::REG::from_u64(iov + i * 16))?.to_u64();
159+
let len = machine.memory_mut().load64(&Mac::REG::from_u64(iov + i * 16 + 8))?.to_u64();
160+
161+
let buf = machine.memory_mut().load_bytes(base, len)?;
162+
163+
written += match write(fd, &buf) {
164+
Ok(w) => w as u64,
165+
Err(e) => {
166+
debug!("write error: {:?}", e);
167+
machine.set_register(A0, Mac::REG::from_i64(-1));
168+
return Ok(());
169+
}
170+
};
171+
}
172+
machine.set_register(A0, Mac::REG::from_u64(written));
173+
Ok(())
174+
}
150175
}
151176

152177
impl<Mac: SupportMachine> Syscalls<Mac> for Stdio {
@@ -160,6 +185,7 @@ impl<Mac: SupportMachine> Syscalls<Mac> for Stdio {
160185
62 => self.lseek(machine)?,
161186
63 => self.read(machine)?,
162187
64 => self.write(machine)?,
188+
66 => self.writev(machine)?,
163189
80 => self.fstat(machine)?,
164190
_ => return Ok(false),
165191
};

0 commit comments

Comments
 (0)