diff options
Diffstat (limited to 'drivers/char/hvc_xen.c')
-rw-r--r-- | drivers/char/hvc_xen.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/char/hvc_xen.c b/drivers/char/hvc_xen.c index eba999f8598d..a6ee32b599a8 100644 --- a/drivers/char/hvc_xen.c +++ b/drivers/char/hvc_xen.c | |||
@@ -55,7 +55,7 @@ static inline void notify_daemon(void) | |||
55 | notify_remote_via_evtchn(xen_start_info->console.domU.evtchn); | 55 | notify_remote_via_evtchn(xen_start_info->console.domU.evtchn); |
56 | } | 56 | } |
57 | 57 | ||
58 | static int write_console(uint32_t vtermno, const char *data, int len) | 58 | static int __write_console(const char *data, int len) |
59 | { | 59 | { |
60 | struct xencons_interface *intf = xencons_interface(); | 60 | struct xencons_interface *intf = xencons_interface(); |
61 | XENCONS_RING_IDX cons, prod; | 61 | XENCONS_RING_IDX cons, prod; |
@@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len) | |||
76 | return sent; | 76 | return sent; |
77 | } | 77 | } |
78 | 78 | ||
79 | static int write_console(uint32_t vtermno, const char *data, int len) | ||
80 | { | ||
81 | int ret = len; | ||
82 | |||
83 | /* | ||
84 | * Make sure the whole buffer is emitted, polling if | ||
85 | * necessary. We don't ever want to rely on the hvc daemon | ||
86 | * because the most interesting console output is when the | ||
87 | * kernel is crippled. | ||
88 | */ | ||
89 | while (len) { | ||
90 | int sent = __write_console(data, len); | ||
91 | |||
92 | data += sent; | ||
93 | len -= sent; | ||
94 | |||
95 | if (unlikely(len)) | ||
96 | HYPERVISOR_sched_op(SCHEDOP_yield, NULL); | ||
97 | } | ||
98 | |||
99 | return ret; | ||
100 | } | ||
101 | |||
79 | static int read_console(uint32_t vtermno, char *buf, int len) | 102 | static int read_console(uint32_t vtermno, char *buf, int len) |
80 | { | 103 | { |
81 | struct xencons_interface *intf = xencons_interface(); | 104 | struct xencons_interface *intf = xencons_interface(); |