@@ -178,15 +178,16 @@ static bool kvm_cpu_riscv_sbi(struct kvm_cpu *vcpu)
break;
}
vcpu->kvm_run->riscv_sbi.ret[1] = 0;
- while (str_start <= str_end) {
- if (vcpu->kvm_run->riscv_sbi.function_id ==
- SBI_EXT_DBCN_CONSOLE_WRITE) {
- term_putc(str_start, 1, 0);
- } else {
- if (!term_readable(0))
- break;
- *str_start = term_getc(vcpu->kvm, 0);
- }
+ if (vcpu->kvm_run->riscv_sbi.function_id ==
+ SBI_EXT_DBCN_CONSOLE_WRITE) {
+ int length = (str_end - str_start) + 1;
+
+ term_putc(str_start, length, 0);
+ vcpu->kvm_run->riscv_sbi.ret[1] += length;
+ break;
+ }
+ while (str_start <= str_end && term_readable(0)) {
+ *str_start = term_getc(vcpu->kvm, 0);
vcpu->kvm_run->riscv_sbi.ret[1]++;
str_start++;
}
Currently each character of a string is term_putc()ed individually. This causes a round trip into opensbi for each char. Very inefficient especially since the interface term_putc() does accept a count. This patch passes a count to term_putc() in the SBI_EXT_DBCN_CONSOLE_WRITE path. Signed-off-by: Cyril Bur <cyrilbur@tenstorrent.com> --- V2: Reworked the calculation of length as a variable. No significant change riscv/kvm-cpu.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)