[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 09/10] plat/xen/drivers/cons: Read from Consfront
Signed-off-by: Birlea Costin <costin.birlea@xxxxxxxxx> --- plat/xen/drivers/cons/consfront.c | 69 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/plat/xen/drivers/cons/consfront.c b/plat/xen/drivers/cons/consfront.c index 5e1aa063..6dd8a6f8 100644 --- a/plat/xen/drivers/cons/consfront.c +++ b/plat/xen/drivers/cons/consfront.c @@ -313,6 +313,74 @@ static unsigned int consfront_write(struct uk_consdev *dev, return pvconsole_output(cfdev, buf, len); } +static unsigned int pvconsole_input(struct consfront_dev *cfdev, + char *buf, unsigned int len) +{ + struct xencons_interface *intf; + XENCONS_RING_IDX cons, prod; + unsigned int read = 0; + unsigned int index; + + intf = cfdev->ring; + UK_ASSERT(intf); + + cons = intf->in_cons; + prod = intf->in_prod; + + /* Make sure we have cons & prod before touching the ring */ + mb(); + UK_BUGON((prod - cons) > sizeof(intf->in)); + + while ((read < len) && (cons != prod)) { + index = MASK_XENCONS_IDX(cons++, intf->in); + *(buf + read) = *(intf->in + index); + read++; + } + + /* Ensure characters are written before increasing in_cons */ + mb(); + intf->in_cons = cons; + + return read; +} + +static unsigned int consfront_read(struct uk_consdev *dev, + char *buf, unsigned int len) +{ + struct consfront_dev *cfdev; + struct xencons_interface *intf; + XENCONS_RING_IDX cons, prod; + unsigned int sent = 0; + unsigned int available = 0; + + UK_ASSERT(dev); + + cfdev = to_consfront(dev); + UK_ASSERT(cfdev); + + intf = cfdev->ring; + UK_ASSERT(intf); + + cons = intf->in_cons; + prod = intf->in_prod; + + /* Make sure we have cons & prod */ + mb(); + UK_BUGON((prod - cons) > sizeof(intf->in)); + + available = prod - cons; + + if (!available) + return sent; + + if (available < len) + sent = pvconsole_input(cfdev, buf, available); + else + sent = pvconsole_input(cfdev, buf, len); + + return sent; +} + static void consfront_close(struct uk_consdev *dev) { struct consfront_dev *cfdev; @@ -340,6 +408,7 @@ static const struct uk_consdev_ops consfront_ops = { .start = consfront_start, .stop = consfront_stop, .write = consfront_write, + .read = consfront_read, .close = consfront_close, }; -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |