aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/lguest
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-21 21:24:21 -0400
committerRusty Russell <rusty@rustcorp.com.au>2007-10-23 01:49:56 -0400
commit19f1537b7b8a9a82665db3ad8210a9d954d13acd (patch)
tree793c1f8763350012caa521a55c5778b1c633b7e5 /arch/x86/lguest
parent15045275c32bf6d15d32c2eca8157be9c0ba6e45 (diff)
Lguest support for Virtio
This makes lguest able to use the virtio devices. We change the device descriptor page from a simple array to a variable length "type, config_len, status, config data..." format, and implement virtio_config_ops to read from that config data. We use the virtio ring implementation for an efficient Guest <-> Host virtqueue mechanism, and the new LHCALL_NOTIFY hypercall to kick the host when it changes. We also use LHCALL_NOTIFY on kernel addresses for very very early console output. We could have another hypercall, but this hack works quite well. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'arch/x86/lguest')
-rw-r--r--arch/x86/lguest/Kconfig5
-rw-r--r--arch/x86/lguest/boot.c21
2 files changed, 26 insertions, 0 deletions
diff --git a/arch/x86/lguest/Kconfig b/arch/x86/lguest/Kconfig
index 44dccfd845f8..c4dffbeea5e1 100644
--- a/arch/x86/lguest/Kconfig
+++ b/arch/x86/lguest/Kconfig
@@ -2,8 +2,13 @@ config LGUEST_GUEST
2 bool "Lguest guest support" 2 bool "Lguest guest support"
3 select PARAVIRT 3 select PARAVIRT
4 depends on !X86_PAE 4 depends on !X86_PAE
5 select VIRTIO
5 select VIRTIO_RING 6 select VIRTIO_RING
7 select VIRTIO_CONSOLE
6 help 8 help
7 Lguest is a tiny in-kernel hypervisor. Selecting this will 9 Lguest is a tiny in-kernel hypervisor. Selecting this will
8 allow your kernel to boot under lguest. This option will increase 10 allow your kernel to boot under lguest. This option will increase
9 your kernel size by about 6k. If in doubt, say N. 11 your kernel size by about 6k. If in doubt, say N.
12
13 If you say Y here, make sure you say Y (or M) to the virtio block
14 and net drivers which lguest needs.
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index 959aeebb02f5..495e46a1f111 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -55,6 +55,7 @@
55#include <linux/clockchips.h> 55#include <linux/clockchips.h>
56#include <linux/lguest.h> 56#include <linux/lguest.h>
57#include <linux/lguest_launcher.h> 57#include <linux/lguest_launcher.h>
58#include <linux/virtio_console.h>
58#include <asm/paravirt.h> 59#include <asm/paravirt.h>
59#include <asm/param.h> 60#include <asm/param.h>
60#include <asm/page.h> 61#include <asm/page.h>
@@ -849,6 +850,23 @@ static __init char *lguest_memory_setup(void)
849 return "LGUEST"; 850 return "LGUEST";
850} 851}
851 852
853/* Before virtqueues are set up, we use LHCALL_NOTIFY on normal memory to
854 * produce console output. */
855static __init int early_put_chars(u32 vtermno, const char *buf, int count)
856{
857 char scratch[17];
858 unsigned int len = count;
859
860 if (len > sizeof(scratch) - 1)
861 len = sizeof(scratch) - 1;
862 scratch[len] = '\0';
863 memcpy(scratch, buf, len);
864 hcall(LHCALL_NOTIFY, __pa(scratch), 0, 0);
865
866 /* This routine returns the number of bytes actually written. */
867 return len;
868}
869
852/*G:050 870/*G:050
853 * Patching (Powerfully Placating Performance Pedants) 871 * Patching (Powerfully Placating Performance Pedants)
854 * 872 *
@@ -1048,6 +1066,9 @@ __init void lguest_init(void *boot)
1048 * adapted for lguest's use. */ 1066 * adapted for lguest's use. */
1049 add_preferred_console("hvc", 0, NULL); 1067 add_preferred_console("hvc", 0, NULL);
1050 1068
1069 /* Register our very early console. */
1070 virtio_cons_early_init(early_put_chars);
1071
1051 /* Last of all, we set the power management poweroff hook to point to 1072 /* Last of all, we set the power management poweroff hook to point to
1052 * the Guest routine to power off. */ 1073 * the Guest routine to power off. */
1053 pm_power_off = lguest_power_off; 1074 pm_power_off = lguest_power_off;