[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 11/16] Save/Restore Support: Add suspend/restore support for console
Signed-off-by: Bruno Alvisio <bruno.alvisio@xxxxxxxxx> --- console/console.c | 15 ++++++++++++++- console/xenbus.c | 3 +-- console/xencons_ring.c | 41 +++++++++++++++++++++++++++++++---------- include/console.h | 6 +++++- kernel.c | 4 ++++ lib/sys.c | 2 +- 6 files changed, 56 insertions(+), 15 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..1df8304 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,7 +179,6 @@ 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; if (!console_evtchn) @@ -193,16 +194,24 @@ struct consfront_dev *xencons_ring_init(void) #ifdef HAVE_LIBC dev->fd = -1; #endif + + return resume_xen_console(dev); +} + +static struct consfront_dev* resume_xen_console(struct consfront_dev* dev) +{ + int err; + 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); + free(dev); return NULL; } - unmask_evtchn(dev->evtchn); + unmask_evtchn(dev->evtchn); /* In case we have in-flight data after save/restore... */ notify_daemon(dev); @@ -210,8 +219,20 @@ struct consfront_dev *xencons_ring_init(void) 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 a16b1ba..fd1c4c5 100644 --- a/kernel.c +++ b/kernel.c @@ -122,10 +122,14 @@ void pre_suspend(void) local_irq_disable(); suspend_time(); + + suspend_console(); } void post_suspend(int canceled) { + resume_console(); + resume_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 |