[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 11/16] Save/Restore Support: Add suspend/restore support for console
Signed-off-by: Bruno Alvisio <bruno.alvisio@xxxxxxxxx> Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> --- console/console.c | 15 ++++++++- console/xenbus.c | 3 +- console/xencons_ring.c | 83 +++++++++++++++++++++++++++++++------------------- include/console.h | 6 +++- kernel.c | 4 +++ lib/sys.c | 2 +- 6 files changed, 77 insertions(+), 36 deletions(-) diff --git a/console/console.c b/console/console.c index 2e04552..9814506 100644 --- a/console/console.c +++ b/console/console.c @@ -52,6 +52,7 @@ /* If console not initialised the printk will be sent to xen serial line NOTE: you need to enable verbose in xen/Rules.mk for it to work. */ +static struct consfront_dev* xen_console = NULL; static int console_initialised = 0; __attribute__((weak)) void console_input(char * buf, unsigned len) @@ -162,8 +163,20 @@ void xprintk(const char *fmt, ...) void init_console(void) { printk("Initialising console ... "); - xencons_ring_init(); + xen_console = xencons_ring_init(); console_initialised = 1; /* This is also required to notify the daemon */ printk("done.\n"); } + +void suspend_console(void) +{ + console_initialised = 0; + xencons_ring_fini(xen_console); +} + +void resume_console(void) +{ + xencons_ring_resume(xen_console); + console_initialised = 1; +} \ No newline at end of file diff --git a/console/xenbus.c b/console/xenbus.c index 1c9a590..654b469 100644 --- a/console/xenbus.c +++ b/console/xenbus.c @@ -188,8 +188,7 @@ error: return NULL; } -void fini_console(struct consfront_dev *dev) +void fini_consfront(struct consfront_dev *dev) { if (dev) free_consfront(dev); } - diff --git a/console/xencons_ring.c b/console/xencons_ring.c index dd64a41..b6db74e 100644 --- a/console/xencons_ring.c +++ b/console/xencons_ring.c @@ -19,6 +19,8 @@ DECLARE_WAIT_QUEUE_HEAD(console_queue); static struct xencons_interface *console_ring; uint32_t console_evtchn; +static struct consfront_dev* resume_xen_console(struct consfront_dev* dev); + #ifdef CONFIG_PARAVIRT void get_console(void *p) { @@ -32,10 +34,12 @@ void get_console(void *p) { uint64_t v = -1; - hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v); + if (hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v)) + BUG(); console_evtchn = v; - hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v); + if (hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v)) + BUG(); console_ring = (struct xencons_interface *)map_frame_virt(v); } #endif @@ -89,9 +93,7 @@ int xencons_ring_send(struct consfront_dev *dev, const char *data, unsigned len) notify_daemon(dev); return sent; -} - - +} void console_handle_input(evtchn_port_t port, struct pt_regs *regs, void *data) { @@ -177,41 +179,60 @@ int xencons_ring_recv(struct consfront_dev *dev, char *data, unsigned len) struct consfront_dev *xencons_ring_init(void) { - int err; - struct consfront_dev *dev; + struct consfront_dev *dev; - if (!console_evtchn) - return 0; + if (!console_evtchn) + return 0; - dev = malloc(sizeof(struct consfront_dev)); - memset(dev, 0, sizeof(struct consfront_dev)); - dev->nodename = "device/console"; - dev->dom = 0; - dev->backend = 0; - dev->ring_ref = 0; + dev = malloc(sizeof(struct consfront_dev)); + memset(dev, 0, sizeof(struct consfront_dev)); + dev->nodename = "device/console"; + dev->dom = 0; + dev->backend = 0; + dev->ring_ref = 0; #ifdef HAVE_LIBC - dev->fd = -1; + dev->fd = -1; #endif - dev->evtchn = console_evtchn; - dev->ring = xencons_interface(); - - err = bind_evtchn(dev->evtchn, console_handle_input, dev); - if (err <= 0) { - printk("XEN console request chn bind failed %i\n", err); - free(dev); - return NULL; - } - unmask_evtchn(dev->evtchn); - /* In case we have in-flight data after save/restore... */ - notify_daemon(dev); + return resume_xen_console(dev); +} + +static struct consfront_dev* resume_xen_console(struct consfront_dev* dev) +{ + int err; - return dev; + dev->evtchn = console_evtchn; + dev->ring = xencons_interface(); + + err = bind_evtchn(dev->evtchn, console_handle_input, dev); + if (err <= 0) { + printk("XEN console request chn bind failed %i\n", err); + free(dev); + return NULL; + } + unmask_evtchn(dev->evtchn); + + /* In case we have in-flight data after save/restore... */ + notify_daemon(dev); + + return dev; } -void xencons_resume(void) +void xencons_ring_fini(struct consfront_dev* dev) { - (void)xencons_ring_init(); + if (dev) + mask_evtchn(dev->evtchn); } +void xencons_ring_resume(struct consfront_dev* dev) +{ + if (dev) { +#if CONFIG_PARAVIRT + get_console(&start_info); +#else + get_console(0); +#endif + resume_xen_console(dev); + } +} diff --git a/include/console.h b/include/console.h index 539cccd..0d7bf07 100644 --- a/include/console.h +++ b/include/console.h @@ -78,11 +78,15 @@ void xencons_tx(void); void get_console(void *p); void init_console(void); void console_print(struct consfront_dev *dev, char *data, int length); -void fini_console(struct consfront_dev *dev); +void fini_consfront(struct consfront_dev *dev); +void suspend_console(void); +void resume_console(void); /* Low level functions defined in xencons_ring.c */ extern struct wait_queue_head console_queue; struct consfront_dev *xencons_ring_init(void); +void xencons_ring_fini(struct consfront_dev* dev); +void xencons_ring_resume(struct consfront_dev* dev); struct consfront_dev *init_consfront(char *_nodename); int xencons_ring_send(struct consfront_dev *dev, const char *data, unsigned len); int xencons_ring_send_no_notify(struct consfront_dev *dev, const char *data, unsigned len); diff --git a/kernel.c b/kernel.c index 3564af3..2fb69bf 100644 --- a/kernel.c +++ b/kernel.c @@ -122,10 +122,14 @@ void pre_suspend(void) local_irq_disable(); fini_time(); + + suspend_console(); } void post_suspend(int canceled) { + resume_console(); + init_time(); local_irq_enable(); diff --git a/lib/sys.c b/lib/sys.c index 23dc2a5..da434fc 100644 --- a/lib/sys.c +++ b/lib/sys.c @@ -487,7 +487,7 @@ int close(int fd) #ifdef CONFIG_CONSFRONT case FTYPE_SAVEFILE: case FTYPE_CONSOLE: - fini_console(files[fd].cons.dev); + fini_consfront(files[fd].cons.dev); files[fd].type = FTYPE_NONE; return 0; #endif -- 2.3.2 (Apple Git-55) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |