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@xxxxxxxxxxxxxxx> --- riscv/kvm-cpu.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/riscv/kvm-cpu.c b/riscv/kvm-cpu.c index 0c171da..f2fe9c2 100644 --- a/riscv/kvm-cpu.c +++ b/riscv/kvm-cpu.c @@ -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) { + term_putc(str_start, + (int)(str_end - str_start) + 1, 0); + vcpu->kvm_run->riscv_sbi.ret[1] += + (int)(str_end - str_start) + 1; + 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++; } -- 2.34.1