Commit 9a6fc8d0f8c3ee3d42417e8315fc8c8fae1d3213

Authored by Linus Torvalds

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)