Em qui., 23 de dez. de 2021 às 09:54, Cédric Le Goater <c...@kaod.org> escreveu:
>
> [ Adding Klaus ]

Thanks Cedric. It's been a while since I've looked at this but I'll do my best..

>
> On 12/22/21 03:22, Troy Lee wrote:
> > Accumulative mode will supply a initial state and append padding bit at
> > the end of hash stream.  However, the crypto library will padding those
> > bit automatically, so ripped it off from iov array.
> >
> > Signed-off-by: Troy Lee <troy_...@aspeedtech.com>
> > ---
> >   hw/misc/aspeed_hace.c         | 30 ++++++++++++++++++++++++++++--
> >   include/hw/misc/aspeed_hace.h |  1 +
> >   2 files changed, 29 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
> > index 10f00e65f4..7c1794d6d0 100644
> > --- a/hw/misc/aspeed_hace.c
> > +++ b/hw/misc/aspeed_hace.c
> > @@ -27,6 +27,7 @@
> >
> >   #define R_HASH_SRC      (0x20 / 4)
> >   #define R_HASH_DEST     (0x24 / 4)
> > +#define R_HASH_KEY_BUFF (0x28 / 4)
> >   #define R_HASH_SRC_LEN  (0x2c / 4)
> >
> >   #define R_HASH_CMD      (0x30 / 4)
> > @@ -94,7 +95,10 @@ static int hash_algo_lookup(uint32_t reg)
> >       return -1;
> >   }
> >
> > -static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
> > +static void do_hash_operation(AspeedHACEState *s,
> > +                              int algo,
> > +                              bool sg_mode,
> > +                              bool acc_mode)
> >   {
> >       struct iovec iov[ASPEED_HACE_MAX_SG];
> >       g_autofree uint8_t *digest_buf;
> > @@ -103,6 +107,7 @@ static void do_hash_operation(AspeedHACEState *s, int 
> > algo, bool sg_mode)
> >
> >       if (sg_mode) {
> >           uint32_t len = 0;
> > +        uint32_t total_len = 0;
> >
> >           for (i = 0; !(len & SG_LIST_LEN_LAST); i++) {
> >               uint32_t addr, src;
> > @@ -127,6 +132,21 @@ static void do_hash_operation(AspeedHACEState *s, int 
> > algo, bool sg_mode)
> >               plen = iov[i].iov_len;
> >               iov[i].iov_base = address_space_map(&s->dram_as, addr, &plen, 
> > false,
> >                                                   MEMTXATTRS_UNSPECIFIED);
> > +
> > +            total_len += plen;
> > +            if (acc_mode && len & SG_LIST_LEN_LAST) {
I think we should make the precedence here explicit (with the use of
()) instead of implicit. Also, isn't (len * SGL_LIST_LEN_LAST) always
true inside this for loop?

> > +                /*
> > +                 * Read the message length in bit from last 64/128 bits
> > +                 * and tear the padding bits from iov
> > +                 */
> > +                uint64_t stream_len;
> > +
> > +                memcpy(&stream_len, iov[i].iov_base + iov[i].iov_len - 8, 
> > 8);
> > +                stream_len = __bswap_64(stream_len) / 8;
> > +

I no longer have access to the aspeed workbook I guess, but what is
the actual specification here? is the message length 64 or 128 bits?
and bswap seems arch-dependent - you probably want to be explicit if
this is big or little-endian and use the appropriate conversion
function.

> > +                if (total_len > stream_len)
> > +                    iov[i].iov_len -= total_len - stream_len;
> > +            }

I guess you're not using total_len except for this comparison? Feels
like there's a better way to first compare and then assign the value,
other than assign, compare, re-assign etc.

The rest of it looks fine apparently. Are you planning on adding to
the testcases are well?

Thanks,

 -Klaus

 /*
 <kl...@klauskiwi.com> - http://blog.klauskiwi.com
 */

> >           }
> >       } else {
> >           hwaddr len = s->regs[R_HASH_SRC_LEN];
> > @@ -210,6 +230,9 @@ static void aspeed_hace_write(void *opaque, hwaddr 
> > addr, uint64_t data,
> >       case R_HASH_DEST:
> >           data &= ahc->dest_mask;
> >           break;
> > +    case R_HASH_KEY_BUFF:
> > +        data &= ahc->key_mask;
> > +        break;
> >       case R_HASH_SRC_LEN:
> >           data &= 0x0FFFFFFF;
> >           break;
> > @@ -234,7 +257,7 @@ static void aspeed_hace_write(void *opaque, hwaddr 
> > addr, uint64_t data,
> >                           __func__, data & ahc->hash_mask);
> >                   break;
> >           }
> > -        do_hash_operation(s, algo, data & HASH_SG_EN);
> > +        do_hash_operation(s, algo, data & HASH_SG_EN, data & 
> > HASH_DIGEST_ACCUM);
> >
> >           if (data & HASH_IRQ_EN) {
> >               qemu_irq_raise(s->irq);
> > @@ -333,6 +356,7 @@ static void aspeed_ast2400_hace_class_init(ObjectClass 
> > *klass, void *data)
> >
> >       ahc->src_mask = 0x0FFFFFFF;
> >       ahc->dest_mask = 0x0FFFFFF8;
> > +    ahc->key_mask = 0x0FFFFFC0;
> >       ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
> >   }
> >
> > @@ -351,6 +375,7 @@ static void aspeed_ast2500_hace_class_init(ObjectClass 
> > *klass, void *data)
> >
> >       ahc->src_mask = 0x3fffffff;
> >       ahc->dest_mask = 0x3ffffff8;
> > +    ahc->key_mask = 0x3FFFFFC0;
> >       ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
> >   }
> >
> > @@ -369,6 +394,7 @@ static void aspeed_ast2600_hace_class_init(ObjectClass 
> > *klass, void *data)
> >
> >       ahc->src_mask = 0x7FFFFFFF;
> >       ahc->dest_mask = 0x7FFFFFF8;
> > +    ahc->key_mask = 0x7FFFFFF8;
> >       ahc->hash_mask = 0x00147FFF;
> >   }
> >
> > diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
> > index 94d5ada95f..2242945eb4 100644
> > --- a/include/hw/misc/aspeed_hace.h
> > +++ b/include/hw/misc/aspeed_hace.h
> > @@ -37,6 +37,7 @@ struct AspeedHACEClass {
> >
> >       uint32_t src_mask;
> >       uint32_t dest_mask;
> > +    uint32_t key_mask;
> >       uint32_t hash_mask;
> >   };
> >
> >
>

Reply via email to