Message ID | 20221227064812.1903326-8-bmeng@tinylab.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/riscv: Improve Spike HTIF emulation fidelity | expand |
On 12/27/22 03:48, Bin Meng wrote: > At present the HTIF proxy syscall is unsupported. On RV32, only > device 0 is supported so there is no console device for RV32. > The only way to implement console funtionality on RV32 is to > support the SYS_WRITE syscall. > > With this commit, the Spike machine is able to boot the 32-bit > OpenSBI generic image. > > Signed-off-by: Bin Meng <bmeng@tinylab.org> > --- Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > > hw/char/riscv_htif.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c > index 3bb0a37a3e..1477fc0090 100644 > --- a/hw/char/riscv_htif.c > +++ b/hw/char/riscv_htif.c > @@ -48,6 +48,9 @@ > #define HTIF_CONSOLE_CMD_GETC 0 > #define HTIF_CONSOLE_CMD_PUTC 1 > > +/* PK system call number */ > +#define PK_SYS_WRITE 64 > + > static uint64_t fromhost_addr, tohost_addr; > static int address_symbol_set; > > @@ -165,7 +168,19 @@ static void htif_handle_tohost_write(HTIFState *s, uint64_t val_written) > int exit_code = payload >> 1; > exit(exit_code); > } else { > - qemu_log_mask(LOG_UNIMP, "pk syscall proxy not supported\n"); > + uint64_t syscall[8]; > + cpu_physical_memory_read(payload, syscall, sizeof(syscall)); > + if (syscall[0] == PK_SYS_WRITE && > + syscall[1] == HTIF_DEV_CONSOLE && > + syscall[3] == HTIF_CONSOLE_CMD_PUTC) { > + uint8_t ch; > + cpu_physical_memory_read(syscall[2], &ch, 1); > + qemu_chr_fe_write(&s->chr, &ch, 1); > + resp = 0x100 | (uint8_t)payload; > + } else { > + qemu_log_mask(LOG_UNIMP, > + "pk syscall proxy not supported\n"); > + } > } > } else { > qemu_log("HTIF device %d: unknown command\n", device);
On Tue, Dec 27, 2022 at 4:49 PM Bin Meng <bmeng@tinylab.org> wrote: > > At present the HTIF proxy syscall is unsupported. On RV32, only > device 0 is supported so there is no console device for RV32. > The only way to implement console funtionality on RV32 is to > support the SYS_WRITE syscall. > > With this commit, the Spike machine is able to boot the 32-bit > OpenSBI generic image. > > Signed-off-by: Bin Meng <bmeng@tinylab.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > > hw/char/riscv_htif.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c > index 3bb0a37a3e..1477fc0090 100644 > --- a/hw/char/riscv_htif.c > +++ b/hw/char/riscv_htif.c > @@ -48,6 +48,9 @@ > #define HTIF_CONSOLE_CMD_GETC 0 > #define HTIF_CONSOLE_CMD_PUTC 1 > > +/* PK system call number */ > +#define PK_SYS_WRITE 64 > + > static uint64_t fromhost_addr, tohost_addr; > static int address_symbol_set; > > @@ -165,7 +168,19 @@ static void htif_handle_tohost_write(HTIFState *s, uint64_t val_written) > int exit_code = payload >> 1; > exit(exit_code); > } else { > - qemu_log_mask(LOG_UNIMP, "pk syscall proxy not supported\n"); > + uint64_t syscall[8]; > + cpu_physical_memory_read(payload, syscall, sizeof(syscall)); > + if (syscall[0] == PK_SYS_WRITE && > + syscall[1] == HTIF_DEV_CONSOLE && > + syscall[3] == HTIF_CONSOLE_CMD_PUTC) { > + uint8_t ch; > + cpu_physical_memory_read(syscall[2], &ch, 1); > + qemu_chr_fe_write(&s->chr, &ch, 1); > + resp = 0x100 | (uint8_t)payload; > + } else { > + qemu_log_mask(LOG_UNIMP, > + "pk syscall proxy not supported\n"); > + } > } > } else { > qemu_log("HTIF device %d: unknown command\n", device); > -- > 2.34.1 > >
diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c index 3bb0a37a3e..1477fc0090 100644 --- a/hw/char/riscv_htif.c +++ b/hw/char/riscv_htif.c @@ -48,6 +48,9 @@ #define HTIF_CONSOLE_CMD_GETC 0 #define HTIF_CONSOLE_CMD_PUTC 1 +/* PK system call number */ +#define PK_SYS_WRITE 64 + static uint64_t fromhost_addr, tohost_addr; static int address_symbol_set; @@ -165,7 +168,19 @@ static void htif_handle_tohost_write(HTIFState *s, uint64_t val_written) int exit_code = payload >> 1; exit(exit_code); } else { - qemu_log_mask(LOG_UNIMP, "pk syscall proxy not supported\n"); + uint64_t syscall[8]; + cpu_physical_memory_read(payload, syscall, sizeof(syscall)); + if (syscall[0] == PK_SYS_WRITE && + syscall[1] == HTIF_DEV_CONSOLE && + syscall[3] == HTIF_CONSOLE_CMD_PUTC) { + uint8_t ch; + cpu_physical_memory_read(syscall[2], &ch, 1); + qemu_chr_fe_write(&s->chr, &ch, 1); + resp = 0x100 | (uint8_t)payload; + } else { + qemu_log_mask(LOG_UNIMP, + "pk syscall proxy not supported\n"); + } } } else { qemu_log("HTIF device %d: unknown command\n", device);
At present the HTIF proxy syscall is unsupported. On RV32, only device 0 is supported so there is no console device for RV32. The only way to implement console funtionality on RV32 is to support the SYS_WRITE syscall. With this commit, the Spike machine is able to boot the 32-bit OpenSBI generic image. Signed-off-by: Bin Meng <bmeng@tinylab.org> --- hw/char/riscv_htif.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)