From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
To: Bin Meng <bmeng@tinylab.org>,
Alistair Francis <Alistair.Francis@wdc.com>,
qemu-devel@nongnu.org
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: Re: [PATCH 01/12] hw/char: riscv_htif: Avoid using magic numbers
Date: Tue, 27 Dec 2022 14:28:55 -0300 [thread overview]
Message-ID: <ae088461-663a-0a08-e34d-79f4a2a2c80e@ventanamicro.com> (raw)
In-Reply-To: <20221227064812.1903326-2-bmeng@tinylab.org>
On 12/27/22 03:48, Bin Meng wrote:
> The Spike HTIF is poorly documented. The only relevant info we can
> get from the internet is from Andrew Waterman at [1].
>
> Add a comment block before htif_handle_tohost_write() to explain
> the tohost register format, and use meaningful macros intead of
s/intead/instead
> magic numbers in the codes.
>
> While we are here, corret 2 multi-line comment blocks that have
s/corret/correct
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> wrong format.
>
> Link: https://github.com/riscv-software-src/riscv-isa-sim/issues/364 [1]
> Signed-off-by: Bin Meng <bmeng@tinylab.org>
> ---
>
> hw/char/riscv_htif.c | 72 ++++++++++++++++++++++++++++++++------------
> 1 file changed, 52 insertions(+), 20 deletions(-)
>
> diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c
> index 6577f0e640..088556bb04 100644
> --- a/hw/char/riscv_htif.c
> +++ b/hw/char/riscv_htif.c
> @@ -38,6 +38,16 @@
> } \
> } while (0)
>
> +#define HTIF_DEV_SHIFT 56
> +#define HTIF_CMD_SHIFT 48
> +
> +#define HTIF_DEV_SYSTEM 0
> +#define HTIF_DEV_CONSOLE 1
> +
> +#define HTIF_SYSTEM_CMD_SYSCALL 0
> +#define HTIF_CONSOLE_CMD_GETC 0
> +#define HTIF_CONSOLE_CMD_PUTC 1
> +
> static uint64_t fromhost_addr, tohost_addr;
> static int address_symbol_set;
>
> @@ -81,9 +91,11 @@ static void htif_recv(void *opaque, const uint8_t *buf, int size)
> return;
> }
>
> - /* TODO - we need to check whether mfromhost is zero which indicates
> - the device is ready to receive. The current implementation
> - will drop characters */
> + /*
> + * TODO - we need to check whether mfromhost is zero which indicates
> + * the device is ready to receive. The current implementation
> + * will drop characters
> + */
>
> uint64_t val_written = htifstate->pending_read;
> uint64_t resp = 0x100 | *buf;
> @@ -110,10 +122,30 @@ static int htif_be_change(void *opaque)
> return 0;
> }
>
> +/*
> + * See below the tohost register format.
> + *
> + * Bits 63:56 indicate the "device".
> + * Bits 55:48 indicate the "command".
> + *
> + * Device 0 is the syscall device, which is used to emulate Unixy syscalls.
> + * It only implements command 0, which has two subfunctions:
> + * - If bit 0 is clear, then bits 47:0 represent a pointer to a struct
> + * describing the syscall.
> + * - If bit 1 is set, then bits 47:1 represent an exit code, with a zero
> + * value indicating success and other values indicating failure.
> + *
> + * Device 1 is the blocking character device.
> + * - Command 0 reads a character
> + * - Command 1 writes a character from the 8 LSBs of tohost
> + *
> + * For RV32, the tohost register is zero-extended, so only device=0 and
> + * command=0 (i.e. HTIF syscalls/exit codes) are supported.
> + */
> static void htif_handle_tohost_write(HTIFState *htifstate, uint64_t val_written)
> {
> - uint8_t device = val_written >> 56;
> - uint8_t cmd = val_written >> 48;
> + uint8_t device = val_written >> HTIF_DEV_SHIFT;
> + uint8_t cmd = val_written >> HTIF_CMD_SHIFT;
> uint64_t payload = val_written & 0xFFFFFFFFFFFFULL;
> int resp = 0;
>
> @@ -125,9 +157,9 @@ static void htif_handle_tohost_write(HTIFState *htifstate, uint64_t val_written)
> * 0: riscv-tests Pass/Fail Reporting Only (no syscall proxy)
> * 1: Console
> */
> - if (unlikely(device == 0x0)) {
> + if (unlikely(device == HTIF_DEV_SYSTEM)) {
> /* frontend syscall handler, shutdown and exit code support */
> - if (cmd == 0x0) {
> + if (cmd == HTIF_SYSTEM_CMD_SYSCALL) {
> if (payload & 0x1) {
> /* exit code */
> int exit_code = payload >> 1;
> @@ -138,14 +170,14 @@ static void htif_handle_tohost_write(HTIFState *htifstate, uint64_t val_written)
> } else {
> qemu_log("HTIF device %d: unknown command\n", device);
> }
> - } else if (likely(device == 0x1)) {
> + } else if (likely(device == HTIF_DEV_CONSOLE)) {
> /* HTIF Console */
> - if (cmd == 0x0) {
> + if (cmd == HTIF_CONSOLE_CMD_GETC) {
> /* this should be a queue, but not yet implemented as such */
> htifstate->pending_read = val_written;
> htifstate->env->mtohost = 0; /* clear to indicate we read */
> return;
> - } else if (cmd == 0x1) {
> + } else if (cmd == HTIF_CONSOLE_CMD_PUTC) {
> qemu_chr_fe_write(&htifstate->chr, (uint8_t *)&payload, 1);
> resp = 0x100 | (uint8_t)payload;
> } else {
> @@ -157,15 +189,15 @@ static void htif_handle_tohost_write(HTIFState *htifstate, uint64_t val_written)
> " payload: %016" PRIx64, device, cmd, payload & 0xFF, payload);
> }
> /*
> - * - latest bbl does not set fromhost to 0 if there is a value in tohost
> - * - with this code enabled, qemu hangs waiting for fromhost to go to 0
> - * - with this code disabled, qemu works with bbl priv v1.9.1 and v1.10
> - * - HTIF needs protocol documentation and a more complete state machine
> -
> - while (!htifstate->fromhost_inprogress &&
> - htifstate->env->mfromhost != 0x0) {
> - }
> - */
> + * Latest bbl does not set fromhost to 0 if there is a value in tohost.
> + * With this code enabled, qemu hangs waiting for fromhost to go to 0.
> + * With this code disabled, qemu works with bbl priv v1.9.1 and v1.10.
> + * HTIF needs protocol documentation and a more complete state machine.
> + *
> + * while (!htifstate->fromhost_inprogress &&
> + * htifstate->env->mfromhost != 0x0) {
> + * }
> + */
> htifstate->env->mfromhost = (val_written >> 48 << 48) | (resp << 16 >> 16);
> htifstate->env->mtohost = 0; /* clear to indicate we read */
> }
> @@ -196,7 +228,7 @@ static uint64_t htif_mm_read(void *opaque, hwaddr addr, unsigned size)
>
> /* CPU wrote to an HTIF register */
> static void htif_mm_write(void *opaque, hwaddr addr,
> - uint64_t value, unsigned size)
> + uint64_t value, unsigned size)
> {
> HTIFState *htifstate = opaque;
> if (addr == TOHOST_OFFSET1) {
next prev parent reply other threads:[~2022-12-27 17:29 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-27 6:48 [PATCH 00/12] hw/riscv: Improve Spike HTIF emulation fidelity Bin Meng
2022-12-27 6:48 ` [PATCH 01/12] hw/char: riscv_htif: Avoid using magic numbers Bin Meng
2022-12-27 17:28 ` Daniel Henrique Barboza [this message]
2022-12-28 3:31 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 02/12] hw/char: riscv_htif: Drop {to, from}host_size in HTIFState Bin Meng
2022-12-27 17:29 ` [PATCH 02/12] hw/char: riscv_htif: Drop {to,from}host_size " Daniel Henrique Barboza
2022-12-28 3:32 ` [PATCH 02/12] hw/char: riscv_htif: Drop {to, from}host_size " Alistair Francis
2022-12-27 6:48 ` [PATCH 03/12] hw/char: riscv_htif: Drop useless assignment of memory region Bin Meng
2022-12-27 17:30 ` Daniel Henrique Barboza
2022-12-28 3:33 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 04/12] hw/char: riscv_htif: Use conventional 's' for HTIFState Bin Meng
2022-12-27 17:32 ` Daniel Henrique Barboza
2022-12-28 3:35 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 05/12] hw/char: riscv_htif: Move registers from CPUArchState to HTIFState Bin Meng
2022-12-27 17:33 ` Daniel Henrique Barboza
2022-12-28 4:19 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 06/12] hw/char: riscv_htif: Remove forward declarations for non-existent variables Bin Meng
2022-12-27 17:35 ` Daniel Henrique Barboza
2022-12-28 4:22 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 07/12] hw/char: riscv_htif: Support console output via proxy syscall Bin Meng
2022-12-27 17:37 ` Daniel Henrique Barboza
2022-12-28 4:30 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 08/12] hw/riscv: spike: Remove the out-of-date comments Bin Meng
2022-12-27 17:37 ` Daniel Henrique Barboza
2022-12-28 4:30 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 09/12] hw/riscv/boot.c: make riscv_find_firmware() static Bin Meng
2022-12-27 6:48 ` [PATCH 10/12] hw/riscv/boot.c: introduce riscv_default_firmware_name() Bin Meng
2022-12-27 6:48 ` [PATCH 11/12] hw/riscv/boot.c: Introduce riscv_find_firmware() Bin Meng
2022-12-27 17:40 ` Daniel Henrique Barboza
2022-12-28 4:35 ` Alistair Francis
2022-12-27 6:48 ` [PATCH 12/12] hw/riscv: spike: Decouple create_fdt() dependency to ELF loading Bin Meng
2022-12-27 14:33 ` Daniel Henrique Barboza
2022-12-27 17:51 ` [PATCH 00/12] hw/riscv: Improve Spike HTIF emulation fidelity Daniel Henrique Barboza
2022-12-28 3:58 ` Bin Meng
2022-12-28 4:21 ` Alistair Francis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ae088461-663a-0a08-e34d-79f4a2a2c80e@ventanamicro.com \
--to=dbarboza@ventanamicro.com \
--cc=Alistair.Francis@wdc.com \
--cc=bmeng@tinylab.org \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.