Commit 9a6fc8d0 authored by Linus Torvalds's avatar 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
parents d4116f82 82d64699
...@@ -178,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; ...@@ -178,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
static void xen_cpuid(unsigned int *ax, unsigned int *bx, static void xen_cpuid(unsigned int *ax, unsigned int *bx,
unsigned int *cx, unsigned int *dx) unsigned int *cx, unsigned int *dx)
{ {
unsigned maskebx = ~0;
unsigned maskecx = ~0; unsigned maskecx = ~0;
unsigned maskedx = ~0; unsigned maskedx = ~0;
...@@ -185,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, ...@@ -185,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
* Mask out inconvenient features, to try and disable as many * Mask out inconvenient features, to try and disable as many
* unsupported kernel subsystems as possible. * unsupported kernel subsystems as possible.
*/ */
if (*ax == 1) { switch (*ax) {
case 1:
maskecx = cpuid_leaf1_ecx_mask; maskecx = cpuid_leaf1_ecx_mask;
maskedx = cpuid_leaf1_edx_mask; maskedx = cpuid_leaf1_edx_mask;
break;
case 0xb:
/* Suppress extended topology stuff */
maskebx = 0;
break;
} }
asm(XEN_EMULATE_PREFIX "cpuid" asm(XEN_EMULATE_PREFIX "cpuid"
...@@ -197,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, ...@@ -197,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
"=d" (*dx) "=d" (*dx)
: "0" (*ax), "2" (*cx)); : "0" (*ax), "2" (*cx));
*bx &= maskebx;
*cx &= maskecx; *cx &= maskecx;
*dx &= maskedx; *dx &= maskedx;
} }
......
...@@ -55,7 +55,7 @@ static inline void notify_daemon(void) ...@@ -55,7 +55,7 @@ static inline void notify_daemon(void)
notify_remote_via_evtchn(xen_start_info->console.domU.evtchn); notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
} }
static int write_console(uint32_t vtermno, const char *data, int len) static int __write_console(const char *data, int len)
{ {
struct xencons_interface *intf = xencons_interface(); struct xencons_interface *intf = xencons_interface();
XENCONS_RING_IDX cons, prod; XENCONS_RING_IDX cons, prod;
...@@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len) ...@@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len)
return sent; return sent;
} }
static int write_console(uint32_t vtermno, const char *data, int len)
{
int ret = len;
/*
* Make sure the whole buffer is emitted, polling if
* necessary. We don't ever want to rely on the hvc daemon
* because the most interesting console output is when the
* kernel is crippled.
*/
while (len) {
int sent = __write_console(data, len);
data += sent;
len -= sent;
if (unlikely(len))
HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
}
return ret;
}
static int read_console(uint32_t vtermno, char *buf, int len) static int read_console(uint32_t vtermno, char *buf, int len)
{ {
struct xencons_interface *intf = xencons_interface(); struct xencons_interface *intf = xencons_interface();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment