Commit faeba830 authored by Christian Borntraeger's avatar Christian Borntraeger Committed by Rusty Russell

s390: use virtio_console for KVM on s390

This patch enables virtio_console as the default console on kvm for
s390. We currently use the same notify hack as lguest for early
console output. I will try to address this for lguest and s390 later.
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 7721c494
...@@ -565,6 +565,7 @@ bool "s390 guest support (EXPERIMENTAL)" ...@@ -565,6 +565,7 @@ bool "s390 guest support (EXPERIMENTAL)"
depends on 64BIT && EXPERIMENTAL depends on 64BIT && EXPERIMENTAL
select VIRTIO select VIRTIO
select VIRTIO_RING select VIRTIO_RING
select VIRTIO_CONSOLE
help help
Select this option if you want to run the kernel under s390 linux Select this option if you want to run the kernel under s390 linux
endmenu endmenu
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/ebcdic.h> #include <asm/ebcdic.h>
#include <asm/compat.h> #include <asm/compat.h>
#include <asm/kvm_virtio.h>
long psw_kernel_bits = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY | long psw_kernel_bits = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY |
PSW_MASK_MCHECK | PSW_DEFAULT_KEY); PSW_MASK_MCHECK | PSW_DEFAULT_KEY);
...@@ -766,7 +767,8 @@ setup_arch(char **cmdline_p) ...@@ -766,7 +767,8 @@ setup_arch(char **cmdline_p)
printk("We are running under VM (64 bit mode)\n"); printk("We are running under VM (64 bit mode)\n");
else if (MACHINE_IS_KVM) { else if (MACHINE_IS_KVM) {
printk("We are running under KVM (64 bit mode)\n"); printk("We are running under KVM (64 bit mode)\n");
add_preferred_console("ttyS", 1, NULL); add_preferred_console("hvc", 0, NULL);
s390_virtio_console_init();
} else } else
printk("We are running native (64 bit mode)\n"); printk("We are running native (64 bit mode)\n");
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/virtio.h> #include <linux/virtio.h>
#include <linux/virtio_config.h> #include <linux/virtio_config.h>
#include <linux/virtio_console.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/virtio_ring.h> #include <linux/virtio_ring.h>
#include <linux/pfn.h> #include <linux/pfn.h>
...@@ -333,6 +334,25 @@ static int __init kvm_devices_init(void) ...@@ -333,6 +334,25 @@ static int __init kvm_devices_init(void)
return 0; return 0;
} }
/* code for early console output with virtio_console */
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);
kvm_hypercall1(KVM_S390_VIRTIO_NOTIFY, __pa(scratch));
return len;
}
void s390_virtio_console_init(void)
{
virtio_cons_early_init(early_put_chars);
}
/* /*
* We do this after core stuff, but before the drivers. * We do this after core stuff, but before the drivers.
*/ */
......
...@@ -50,4 +50,14 @@ struct kvm_vqconfig { ...@@ -50,4 +50,14 @@ struct kvm_vqconfig {
#define KVM_S390_VIRTIO_RESET 1 #define KVM_S390_VIRTIO_RESET 1
#define KVM_S390_VIRTIO_SET_STATUS 2 #define KVM_S390_VIRTIO_SET_STATUS 2
#ifdef __KERNEL__
/* early virtio console setup */
#ifdef CONFIG_VIRTIO_CONSOLE
extern void s390_virtio_console_init(void);
#else
static inline void s390_virtio_console_init(void)
{
}
#endif /* CONFIG_VIRTIO_CONSOLE */
#endif /* __KERNEL__ */
#endif #endif
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