Merge git://github.com/rustyrussell/linux
* git://github.com/rustyrussell/linux: lguest: move process freezing before pending signals check lguest: don't allow KVM-detection cpuid. lguest: Allow running under paravirt-enabled KVM.
This commit is contained in:
commit
ce949717b5
|
@ -70,6 +70,7 @@
|
||||||
#include <asm/i387.h>
|
#include <asm/i387.h>
|
||||||
#include <asm/stackprotector.h>
|
#include <asm/stackprotector.h>
|
||||||
#include <asm/reboot.h> /* for struct machine_ops */
|
#include <asm/reboot.h> /* for struct machine_ops */
|
||||||
|
#include <asm/kvm_para.h>
|
||||||
|
|
||||||
/*G:010
|
/*G:010
|
||||||
* Welcome to the Guest!
|
* Welcome to the Guest!
|
||||||
|
@ -455,6 +456,15 @@ static void lguest_cpuid(unsigned int *ax, unsigned int *bx,
|
||||||
*ax &= 0xFFFFF0FF;
|
*ax &= 0xFFFFF0FF;
|
||||||
*ax |= 0x00000500;
|
*ax |= 0x00000500;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is used to detect if we're running under KVM. We might be,
|
||||||
|
* but that's a Host matter, not us. So say we're not.
|
||||||
|
*/
|
||||||
|
case KVM_CPUID_SIGNATURE:
|
||||||
|
*bx = *cx = *dx = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 0x80000000 returns the highest Extended Function, so we futureproof
|
* 0x80000000 returns the highest Extended Function, so we futureproof
|
||||||
* like we do above by limiting it to known fields.
|
* like we do above by limiting it to known fields.
|
||||||
|
|
|
@ -232,6 +232,13 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All long-lived kernel loops need to check with this horrible
|
||||||
|
* thing called the freezer. If the Host is trying to suspend,
|
||||||
|
* it stops us.
|
||||||
|
*/
|
||||||
|
try_to_freeze();
|
||||||
|
|
||||||
/* Check for signals */
|
/* Check for signals */
|
||||||
if (signal_pending(current))
|
if (signal_pending(current))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
@ -245,13 +252,6 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
|
||||||
if (irq < LGUEST_IRQS)
|
if (irq < LGUEST_IRQS)
|
||||||
try_deliver_interrupt(cpu, irq, more);
|
try_deliver_interrupt(cpu, irq, more);
|
||||||
|
|
||||||
/*
|
|
||||||
* All long-lived kernel loops need to check with this horrible
|
|
||||||
* thing called the freezer. If the Host is trying to suspend,
|
|
||||||
* it stops us.
|
|
||||||
*/
|
|
||||||
try_to_freeze();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Just make absolutely sure the Guest is still alive. One of
|
* Just make absolutely sure the Guest is still alive. One of
|
||||||
* those hypercalls could have been fatal, for example.
|
* those hypercalls could have been fatal, for example.
|
||||||
|
@ -313,7 +313,7 @@ static int __init init(void)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* Lguest can't run under Xen, VMI or itself. It does Tricky Stuff. */
|
/* Lguest can't run under Xen, VMI or itself. It does Tricky Stuff. */
|
||||||
if (paravirt_enabled()) {
|
if (get_kernel_rpl() != 0) {
|
||||||
printk("lguest is afraid of being a guest\n");
|
printk("lguest is afraid of being a guest\n");
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue