]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/lguest/boot.c
Lguest support for Virtio
[linux-2.6-omap-h63xx.git] / arch / x86 / lguest / boot.c
index 3a06b51c98ad7aac428aba56b2b933aaf1a8ee86..495e46a1f1111c83df967a2aa3849c2140d53588 100644 (file)
@@ -55,7 +55,7 @@
 #include <linux/clockchips.h>
 #include <linux/lguest.h>
 #include <linux/lguest_launcher.h>
-#include <linux/lguest_bus.h>
+#include <linux/virtio_console.h>
 #include <asm/paravirt.h>
 #include <asm/param.h>
 #include <asm/page.h>
@@ -86,6 +86,7 @@ struct lguest_data lguest_data = {
        .hcall_status = { [0 ... LHCALL_RING_SIZE-1] = 0xFF },
        .noirq_start = (u32)lguest_noirq_start,
        .noirq_end = (u32)lguest_noirq_end,
+       .kernel_address = PAGE_OFFSET,
        .blocked_interrupts = { 1 }, /* Block timer interrupts */
        .syscall_vec = SYSCALL_VECTOR,
 };
@@ -161,46 +162,6 @@ void async_hcall(unsigned long call,
 }
 /*:*/
 
-/* Wrappers for the SEND_DMA and BIND_DMA hypercalls.  This is mainly because
- * Jeff Garzik complained that __pa() should never appear in drivers, and this
- * helps remove most of them.   But also, it wraps some ugliness. */
-void lguest_send_dma(unsigned long key, struct lguest_dma *dma)
-{
-       /* The hcall might not write this if something goes wrong */
-       dma->used_len = 0;
-       hcall(LHCALL_SEND_DMA, key, __pa(dma), 0);
-}
-
-int lguest_bind_dma(unsigned long key, struct lguest_dma *dmas,
-                   unsigned int num, u8 irq)
-{
-       /* This is the only hypercall which actually wants 5 arguments, and we
-        * only support 4.  Fortunately the interrupt number is always less
-        * than 256, so we can pack it with the number of dmas in the final
-        * argument.  */
-       if (!hcall(LHCALL_BIND_DMA, key, __pa(dmas), (num << 8) | irq))
-               return -ENOMEM;
-       return 0;
-}
-
-/* Unbinding is the same hypercall as binding, but with 0 num & irq. */
-void lguest_unbind_dma(unsigned long key, struct lguest_dma *dmas)
-{
-       hcall(LHCALL_BIND_DMA, key, __pa(dmas), 0);
-}
-
-/* For guests, device memory can be used as normal memory, so we cast away the
- * __iomem to quieten sparse. */
-void *lguest_map(unsigned long phys_addr, unsigned long pages)
-{
-       return (__force void *)ioremap(phys_addr, PAGE_SIZE*pages);
-}
-
-void lguest_unmap(void *addr)
-{
-       iounmap((__force void __iomem *)addr);
-}
-
 /*G:033
  * Here are our first native-instruction replacements: four functions for
  * interrupt control.
@@ -889,6 +850,23 @@ static __init char *lguest_memory_setup(void)
        return "LGUEST";
 }
 
+/* Before virtqueues are set up, we use LHCALL_NOTIFY on normal memory to
+ * produce console output. */
+static __init int early_put_chars(u32 vtermno, const char *buf, int count)
+{
+       char scratch[17];
+       unsigned int len = count;
+
+       if (len > sizeof(scratch) - 1)
+               len = sizeof(scratch) - 1;
+       scratch[len] = '\0';
+       memcpy(scratch, buf, len);
+       hcall(LHCALL_NOTIFY, __pa(scratch), 0, 0);
+
+       /* This routine returns the number of bytes actually written. */
+       return len;
+}
+
 /*G:050
  * Patching (Powerfully Placating Performance Pedants)
  *
@@ -1033,11 +1011,7 @@ __init void lguest_init(void *boot)
 
        /*G:070 Now we've seen all the paravirt_ops, we return to
         * lguest_init() where the rest of the fairly chaotic boot setup
-        * occurs.
-        *
-        * The Host expects our first hypercall to tell it where our "struct
-        * lguest_data" is, so we do that first. */
-       hcall(LHCALL_LGUEST_INIT, __pa(&lguest_data), 0, 0);
+        * occurs. */
 
        /* The native boot code sets up initial page tables immediately after
         * the kernel itself, and sets init_pg_tables_end so they're not
@@ -1092,6 +1066,9 @@ __init void lguest_init(void *boot)
         * adapted for lguest's use. */
        add_preferred_console("hvc", 0, NULL);
 
+       /* Register our very early console. */
+       virtio_cons_early_init(early_put_chars);
+
        /* Last of all, we set the power management poweroff hook to point to
         * the Guest routine to power off. */
        pm_power_off = lguest_power_off;