Commit 9a6fc8d0f8c3ee3d42417e8315fc8c8fae1d3213
Exists in
master
and in
7 other branches
Merge branch 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
* 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen: xen: mask extended topology info in cpuid xen/hvc: make sure console output is always emitted, with explicit polling
Showing 2 changed files Side-by-side Diff
arch/x86/xen/enlighten.c
... | ... | @@ -178,6 +178,7 @@ |
178 | 178 | static void xen_cpuid(unsigned int *ax, unsigned int *bx, |
179 | 179 | unsigned int *cx, unsigned int *dx) |
180 | 180 | { |
181 | + unsigned maskebx = ~0; | |
181 | 182 | unsigned maskecx = ~0; |
182 | 183 | unsigned maskedx = ~0; |
183 | 184 | |
184 | 185 | |
... | ... | @@ -185,9 +186,16 @@ |
185 | 186 | * Mask out inconvenient features, to try and disable as many |
186 | 187 | * unsupported kernel subsystems as possible. |
187 | 188 | */ |
188 | - if (*ax == 1) { | |
189 | + switch (*ax) { | |
190 | + case 1: | |
189 | 191 | maskecx = cpuid_leaf1_ecx_mask; |
190 | 192 | maskedx = cpuid_leaf1_edx_mask; |
193 | + break; | |
194 | + | |
195 | + case 0xb: | |
196 | + /* Suppress extended topology stuff */ | |
197 | + maskebx = 0; | |
198 | + break; | |
191 | 199 | } |
192 | 200 | |
193 | 201 | asm(XEN_EMULATE_PREFIX "cpuid" |
... | ... | @@ -197,6 +205,7 @@ |
197 | 205 | "=d" (*dx) |
198 | 206 | : "0" (*ax), "2" (*cx)); |
199 | 207 | |
208 | + *bx &= maskebx; | |
200 | 209 | *cx &= maskecx; |
201 | 210 | *dx &= maskedx; |
202 | 211 | } |
drivers/char/hvc_xen.c
... | ... | @@ -55,7 +55,7 @@ |
55 | 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 | 60 | struct xencons_interface *intf = xencons_interface(); |
61 | 61 | XENCONS_RING_IDX cons, prod; |
... | ... | @@ -74,6 +74,29 @@ |
74 | 74 | |
75 | 75 | notify_daemon(); |
76 | 76 | return sent; |
77 | +} | |
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; | |
77 | 100 | } |
78 | 101 | |
79 | 102 | static int read_console(uint32_t vtermno, char *buf, int len) |