[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 08/10] plat/xen/drivers/cons: Write to Consfront
Signed-off-by: Birlea Costin <costin.birlea@xxxxxxxxx> --- plat/xen/drivers/cons/consfront.c | 62 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/plat/xen/drivers/cons/consfront.c b/plat/xen/drivers/cons/consfront.c index 4dd57151..5e1aa063 100644 --- a/plat/xen/drivers/cons/consfront.c +++ b/plat/xen/drivers/cons/consfront.c @@ -252,6 +252,67 @@ static int consfront_stop(struct uk_consdev *dev) return 0; } +static unsigned int pvconsole_output(struct consfront_dev *dev, + char *buf, unsigned int len) +{ + struct xencons_interface *intf; + XENCONS_RING_IDX cons, prod; + unsigned int sent = 0; + unsigned int index; + + intf = dev->ring; + UK_ASSERT(intf); + + cons = intf->out_cons; + prod = intf->out_prod; + + /* Make sure we have cons & prod before touching the ring */ + mb(); + UK_BUGON((prod - cons) > sizeof(intf->out)); + + while ((sent < len) && ((prod - cons) < sizeof(intf->out))) { + index = MASK_XENCONS_IDX(prod++, intf->out); + intf->out[index] = buf[sent]; + sent++; + } + /* Ensure characters are written before increasing out_prod */ + wmb(); + intf->out_prod = prod; + + notify_remote_via_evtchn(dev->evtchn); + + return sent; +} + +static unsigned int consfront_write(struct uk_consdev *dev, + char *buf, unsigned int len) +{ + struct consfront_dev *cfdev; + struct xencons_interface *intf; + XENCONS_RING_IDX cons, prod; + unsigned int available; + + UK_ASSERT(dev); + + cfdev = to_consfront(dev); + UK_ASSERT(cfdev); + + intf = cfdev->ring; + UK_ASSERT(intf); + + cons = intf->out_cons; + prod = intf->out_prod; + + /* Make sure we have cons & prod */ + mb(); + available = prod - cons; + /* Check if out ring is full */ + if (available > sizeof(intf->out)) + return 0; + + return pvconsole_output(cfdev, buf, len); +} + static void consfront_close(struct uk_consdev *dev) { struct consfront_dev *cfdev; @@ -278,6 +339,7 @@ static const struct uk_consdev_ops consfront_ops = { .release = consfront_release, .start = consfront_start, .stop = consfront_stop, + .write = consfront_write, .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 |