On 12/28/19 7:09 AM, Heinrich Schuchardt wrote:
#define BUFFER_SIZE 16UL

static int virtio_rng_read(struct udevice *dev, void *data, size_t len)
{
     int ret;
     unsigned int rsize = 0;
     unsigned char buf[BUFFER_SIZE];

This should be
        unsigned char buf[BUFFER_SIZE] __aligned(4);

     unsigned char *ptr = data;
     struct virtio_sg sg;
     struct virtio_sg *sgs = sg;
     struct virtio_rng_priv *priv = dev_get_priv(dev);

     while (len) {
         sg.addr = buf;
         sg.length = min(BUFFER_SIZE, len);

         ret = virtqueue_add(priv->rng_vq, &sgs, 0, 1);
         if (ret)
             return ret;

         virtqueue_kick(priv->rng_vq);

         while (!virtqueue_get_buf(priv->rng_vq, &rsize))
             ;
         memcpy(ptr, buf, rsize);
         len -= rsize;
         ptr += rsize;
     }

     return 0;
}

Reply via email to