On Thu, 19 Jun 2025 at 00:06, Jackson Donaldson <jackson88...@gmail.com> wrote:
>
> This commit implements AES for the MAX78000
>
> Signed-off-by: Jackson Donaldson
> ---


> +static uint64_t max78000_aes_read(void *opaque, hwaddr addr,
> +                                    unsigned int size)
> +{
> +    Max78000AesState *s = opaque;
> +    switch (addr) {
> +    case CTRL:
> +        return s->ctrl;
> +
> +    case STATUS:
> +        return s->status;
> +
> +    case INTFL:
> +        return s->intfl;
> +
> +    case INTEN:
> +        return s->inten;
> +
> +    case FIFO:
> +        if (s->result_index >= 4) {
> +            s->intfl &= ~DONE;
> +            s->result_index -= 4;
> +            max78000_aes_set_status(s);
> +            return (s->result[s->result_index] << 24) +
> +                (s->result[s->result_index + 1] << 16) +
> +                (s->result[s->result_index + 2] << 8) +
> +                s->result[s->result_index + 3];

You can write this more simply as
      return ldl_be_p(&s->result[s->result_index]);

(that's a function which loads a big-endian 32-bit value from
the given possibly-unaligned host address).

> +        } else{
> +            return 0;
> +        }
> +
> +    default:
> +        qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%"
> +            HWADDR_PRIx "\n", __func__, addr);
> +        break;
> +
> +    }
> +    return 0;
> +}

> +static void max78000_aes_write(void *opaque, hwaddr addr,
> +                    uint64_t val64, unsigned int size)
> +{
> +    Max78000AesState *s = opaque;
> +    uint32_t val = val64;
> +    int i;
> +    switch (addr) {
> +    case CTRL:
> +        if (val & OUTPUT_FLUSH) {
> +            s->result_index = 0;
> +            val &= ~OUTPUT_FLUSH;
> +        }
> +        if (val & INPUT_FLUSH) {
> +            s->data_index = 0;
> +            val &= ~INPUT_FLUSH;
> +        }
> +        if (val & START) {
> +            max78000_aes_do_crypto(s);
> +        }
> +
> +        /* Hardware appears to stay enabled even if 0 written */
> +        s->ctrl = val | (s->ctrl & AES_EN);
> +        break;
> +
> +    case FIFO:
> +        for (i = 0; i < 4; i++) {
> +            s->data[(12 - s->data_index) + i] =
> +                        (val >> ((3 - i) * 8)) & 0xff;
> +        }

Similarly here this is
           stl_be_p(&s->data[12 - s->data_index], val);

There should be some kind of check here that s->data_index is
in range here before we write to s->data[] (either an assert,
if the device code is supposed to maintain data_index in range
at all times, or else some kind of error handling path if
guest software can do funny things to put it out of range).

> +        s->data_index += 4;
> +        if (s->data_index >= 16) {
> +            s->data_index = 0;
> +            max78000_aes_do_crypto(s);
> +        }
> +        break;
> +
> +    case KEY_BASE ... KEY_END - 4:
> +        for (i = 0; i < 4; i++) {
> +            s->key[(KEY_END - KEY_BASE - 4) - (addr - KEY_BASE) + i] =
> +                        (val >> ((3 - i) * 8)) & 0xff;

   stl_be_p(&s->key[...something...], val);




> +        }
> +        break;
> +
> +    default:
> +        qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%"
> +            HWADDR_PRIx "\n", __func__, addr);
> +        break;
> +
> +    }
> +    max78000_aes_set_status(s);
> +}

thanks
-- PMM

Reply via email to