* [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel modules.
@ 2008-09-06 4:03 Zhang, Xiantao
2008-10-07 13:19 ` Avi Kivity
0 siblings, 1 reply; 3+ messages in thread
From: Zhang, Xiantao @ 2008-09-06 4:03 UTC (permalink / raw)
To: kvm-ia64; +Cc: Avi Kivity, kvm
[-- Attachment #1: Type: text/plain, Size: 5660 bytes --]
>From 664b02928d8243def2acabe99b33eb5fad77bad1 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <xiantao.zhang@intel.com>
Date: Fri, 5 Sep 2008 11:04:24 +0800
Subject: [PATCH] kvm/ia64: Add printk support for kvm-intel modules.
Since this module will be reloated to an isolated address
space from host side, so kvm-intel can't call printk of host
kernel. This patch implements the printk function for kvm-intel
module, so it doesn't need to suffer no-printk pains.
Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
---
arch/ia64/include/asm/kvm_host.h | 17 +++++++++++++++--
arch/ia64/kvm/Makefile | 2 +-
arch/ia64/kvm/kvm-ia64.c | 22 +++++++++++++++++++++-
arch/ia64/kvm/kvm_lib.c | 13 +++++++++++++
arch/ia64/kvm/vmm.c | 21 +++++++++++++++++++++
5 files changed, 71 insertions(+), 4 deletions(-)
create mode 100644 arch/ia64/kvm/kvm_lib.c
diff --git a/arch/ia64/include/asm/kvm_host.h
b/arch/ia64/include/asm/kvm_host.h
index 1efe513..9f05683 100644
--- a/arch/ia64/include/asm/kvm_host.h
+++ b/arch/ia64/include/asm/kvm_host.h
@@ -55,13 +55,17 @@
#define KVM_VMM_SIZE (16UL<<20)
#define KVM_VMM_SHIFT 24
#define KVM_VMM_BASE 0xD000000000000000UL
-#define VMM_SIZE (8UL<<20)
+#define VMM_SIZE (4UL<<20)
+
+/*Define vmm log buffer*/
+#define KVM_VMM_LOG_BASE (KVM_VMM_BASE + VMM_SIZE)
+#define VMM_LOG_SIZE (4UL<<20)
/*
* Define vm_buffer, used by PAL Services, base address.
* Note: vmbuffer is in the VMM-BLOCK, the size must be < 8M
*/
-#define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE)
+#define KVM_VM_BUFFER_BASE (KVM_VMM_LOG_BASE + VMM_LOG_SIZE)
#define KVM_VM_BUFFER_SIZE (8UL<<20)
/*Define Virtual machine data layout.*/
@@ -524,4 +528,13 @@ void kvm_sal_emul(struct kvm_vcpu *vcpu);
static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {}
+#define BYTES_PER_LOG 1024
+
+struct vmm_log_t {
+ spinlock_t log_lock;
+ unsigned long w_pointer;
+ unsigned long r_pointer;
+ char log_slot[VMM_LOG_SIZE/BYTES_PER_LOG][BYTES_PER_LOG - 1];
+};
+
#endif
diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile
index bf22fb9..0d17d84 100644
--- a/arch/ia64/kvm/Makefile
+++ b/arch/ia64/kvm/Makefile
@@ -52,7 +52,7 @@ obj-$(CONFIG_KVM) += kvm.o
FORCE : $(obj)/$(offsets-file)
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o
\
- vtlb.o process.o
+ vtlb.o process.o kvm_lib.o
#Add link memcpy and memset to avoid possible structure assignment
error
kvm-intel-objs += memcpy.o memset.o
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 8a3b5fc..4fd9169 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -496,6 +496,23 @@ static uint32_t kvm_get_exit_reason(struct kvm_vcpu
*vcpu)
return p_exit_data->exit_reason;
}
+static void vcpu_print_vmm_log(void)
+{
+ struct vmm_log_t *vmm_log = (struct vmm_log_t *)(kvm_vmm_base +
+ (KVM_VMM_LOG_BASE -
KVM_VMM_BASE));
+ unsigned int slot;
+
+ spin_lock(&vmm_log->log_lock);
+
+ while (vmm_log->r_pointer < vmm_log->w_pointer) {
+ slot = vmm_log->r_pointer %
(VMM_LOG_SIZE/BYTES_PER_LOG);
+ printk("%s", vmm_log->log_slot[slot]);
+ vmm_log->r_pointer++;
+ }
+
+ spin_unlock(&vmm_log->log_lock);
+}
+
/*
* The guest has exited. See if we can fix it or if we need userspace
* assistance.
@@ -505,6 +522,9 @@ static int kvm_handle_exit(struct kvm_run *kvm_run,
struct kvm_vcpu *vcpu)
u32 exit_reason = kvm_get_exit_reason(vcpu);
vcpu->arch.last_exit = exit_reason;
+ /*vcpu on behalf of VMM to print vmm's kernel log */
+ vcpu_print_vmm_log();
+
if (exit_reason < kvm_vti_max_exit_handlers
&& kvm_vti_exit_handlers[exit_reason])
return kvm_vti_exit_handlers[exit_reason](vcpu,
kvm_run);
@@ -1018,7 +1038,7 @@ static int kvm_alloc_vmm_area(void)
return -ENOMEM;
memset((void *)kvm_vmm_base, 0, KVM_VMM_SIZE);
- kvm_vm_buffer = kvm_vmm_base + VMM_SIZE;
+ kvm_vm_buffer = kvm_vmm_base + VMM_SIZE + VMM_LOG_SIZE;
printk(KERN_DEBUG"kvm:VMM's Base Addr:0x%lx,
vm_buffer:0x%lx\n",
kvm_vmm_base, kvm_vm_buffer);
diff --git a/arch/ia64/kvm/kvm_lib.c b/arch/ia64/kvm/kvm_lib.c
new file mode 100644
index 0000000..4c43efe
--- /dev/null
+++ b/arch/ia64/kvm/kvm_lib.c
@@ -0,0 +1,13 @@
+
+/*
+ * vsprintf.c: Let kvm-intel module has the ability to use print
functions.
+ * Just include kernel's library, and disable symbols export.
+ * Copyright (C) 2008, Intel Corporation.
+ * Xiantao Zhang (xiantao.zhang@intel.com)
+ *
+ */
+
+#undef CONFIG_MODULES
+
+#include "../../../lib/vsprintf.c"
+#include "../../../lib/ctype.c"
diff --git a/arch/ia64/kvm/vmm.c b/arch/ia64/kvm/vmm.c
index 2275bf4..2d14ec2 100644
--- a/arch/ia64/kvm/vmm.c
+++ b/arch/ia64/kvm/vmm.c
@@ -62,5 +62,26 @@ void vmm_spin_unlock(spinlock_t *lock)
{
_vmm_raw_spin_unlock(lock);
}
+
+asmlinkage int printk(const char *fmt, ...)
+{
+ struct vmm_log_t *vmm_log = (struct vmm_log_t
*)KVM_VMM_LOG_BASE;
+ unsigned int slot;
+ va_list args;
+ int r;
+
+ vmm_spin_lock(&vmm_log->log_lock);
+ slot = vmm_log->w_pointer % (VMM_LOG_SIZE/BYTES_PER_LOG);
+ memset(vmm_log->log_slot[slot], 0, BYTES_PER_LOG - 1);
+ va_start(args, fmt);
+ r = vsnprintf(vmm_log->log_slot[slot], BYTES_PER_LOG - 1, fmt,
args);
+ va_end(args);
+ vmm_log->w_pointer++;
+ wmb();
+ vmm_spin_unlock(&vmm_log->log_lock);
+
+ return r;
+}
+
module_init(kvm_vmm_init)
module_exit(kvm_vmm_exit)
--
1.5.1
[-- Attachment #2: 0001-kvm-ia64-Add-printk-support-for-kvm-intel-modules.patch --]
[-- Type: application/octet-stream, Size: 5478 bytes --]
From 664b02928d8243def2acabe99b33eb5fad77bad1 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <xiantao.zhang@intel.com>
Date: Fri, 5 Sep 2008 11:04:24 +0800
Subject: [PATCH] kvm/ia64: Add printk support for kvm-intel modules.
Since this module will be reloated to an isolated address
space from host side, so kvm-intel can't call printk of host
kernel. This patch implements the printk function for kvm-intel
module, so it doesn't need to suffer no-printk pains.
Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
---
arch/ia64/include/asm/kvm_host.h | 17 +++++++++++++++--
arch/ia64/kvm/Makefile | 2 +-
arch/ia64/kvm/kvm-ia64.c | 22 +++++++++++++++++++++-
arch/ia64/kvm/kvm_lib.c | 13 +++++++++++++
arch/ia64/kvm/vmm.c | 21 +++++++++++++++++++++
5 files changed, 71 insertions(+), 4 deletions(-)
create mode 100644 arch/ia64/kvm/kvm_lib.c
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h
index 1efe513..9f05683 100644
--- a/arch/ia64/include/asm/kvm_host.h
+++ b/arch/ia64/include/asm/kvm_host.h
@@ -55,13 +55,17 @@
#define KVM_VMM_SIZE (16UL<<20)
#define KVM_VMM_SHIFT 24
#define KVM_VMM_BASE 0xD000000000000000UL
-#define VMM_SIZE (8UL<<20)
+#define VMM_SIZE (4UL<<20)
+
+/*Define vmm log buffer*/
+#define KVM_VMM_LOG_BASE (KVM_VMM_BASE + VMM_SIZE)
+#define VMM_LOG_SIZE (4UL<<20)
/*
* Define vm_buffer, used by PAL Services, base address.
* Note: vmbuffer is in the VMM-BLOCK, the size must be < 8M
*/
-#define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE)
+#define KVM_VM_BUFFER_BASE (KVM_VMM_LOG_BASE + VMM_LOG_SIZE)
#define KVM_VM_BUFFER_SIZE (8UL<<20)
/*Define Virtual machine data layout.*/
@@ -524,4 +528,13 @@ void kvm_sal_emul(struct kvm_vcpu *vcpu);
static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {}
+#define BYTES_PER_LOG 1024
+
+struct vmm_log_t {
+ spinlock_t log_lock;
+ unsigned long w_pointer;
+ unsigned long r_pointer;
+ char log_slot[VMM_LOG_SIZE/BYTES_PER_LOG][BYTES_PER_LOG - 1];
+};
+
#endif
diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile
index bf22fb9..0d17d84 100644
--- a/arch/ia64/kvm/Makefile
+++ b/arch/ia64/kvm/Makefile
@@ -52,7 +52,7 @@ obj-$(CONFIG_KVM) += kvm.o
FORCE : $(obj)/$(offsets-file)
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
- vtlb.o process.o
+ vtlb.o process.o kvm_lib.o
#Add link memcpy and memset to avoid possible structure assignment error
kvm-intel-objs += memcpy.o memset.o
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 8a3b5fc..4fd9169 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -496,6 +496,23 @@ static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
return p_exit_data->exit_reason;
}
+static void vcpu_print_vmm_log(void)
+{
+ struct vmm_log_t *vmm_log = (struct vmm_log_t *)(kvm_vmm_base +
+ (KVM_VMM_LOG_BASE - KVM_VMM_BASE));
+ unsigned int slot;
+
+ spin_lock(&vmm_log->log_lock);
+
+ while (vmm_log->r_pointer < vmm_log->w_pointer) {
+ slot = vmm_log->r_pointer % (VMM_LOG_SIZE/BYTES_PER_LOG);
+ printk("%s", vmm_log->log_slot[slot]);
+ vmm_log->r_pointer++;
+ }
+
+ spin_unlock(&vmm_log->log_lock);
+}
+
/*
* The guest has exited. See if we can fix it or if we need userspace
* assistance.
@@ -505,6 +522,9 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
u32 exit_reason = kvm_get_exit_reason(vcpu);
vcpu->arch.last_exit = exit_reason;
+ /*vcpu on behalf of VMM to print vmm's kernel log */
+ vcpu_print_vmm_log();
+
if (exit_reason < kvm_vti_max_exit_handlers
&& kvm_vti_exit_handlers[exit_reason])
return kvm_vti_exit_handlers[exit_reason](vcpu, kvm_run);
@@ -1018,7 +1038,7 @@ static int kvm_alloc_vmm_area(void)
return -ENOMEM;
memset((void *)kvm_vmm_base, 0, KVM_VMM_SIZE);
- kvm_vm_buffer = kvm_vmm_base + VMM_SIZE;
+ kvm_vm_buffer = kvm_vmm_base + VMM_SIZE + VMM_LOG_SIZE;
printk(KERN_DEBUG"kvm:VMM's Base Addr:0x%lx, vm_buffer:0x%lx\n",
kvm_vmm_base, kvm_vm_buffer);
diff --git a/arch/ia64/kvm/kvm_lib.c b/arch/ia64/kvm/kvm_lib.c
new file mode 100644
index 0000000..4c43efe
--- /dev/null
+++ b/arch/ia64/kvm/kvm_lib.c
@@ -0,0 +1,13 @@
+
+/*
+ * vsprintf.c: Let kvm-intel module has the ability to use print functions.
+ * Just include kernel's library, and disable symbols export.
+ * Copyright (C) 2008, Intel Corporation.
+ * Xiantao Zhang (xiantao.zhang@intel.com)
+ *
+ */
+
+#undef CONFIG_MODULES
+
+#include "../../../lib/vsprintf.c"
+#include "../../../lib/ctype.c"
diff --git a/arch/ia64/kvm/vmm.c b/arch/ia64/kvm/vmm.c
index 2275bf4..2d14ec2 100644
--- a/arch/ia64/kvm/vmm.c
+++ b/arch/ia64/kvm/vmm.c
@@ -62,5 +62,26 @@ void vmm_spin_unlock(spinlock_t *lock)
{
_vmm_raw_spin_unlock(lock);
}
+
+asmlinkage int printk(const char *fmt, ...)
+{
+ struct vmm_log_t *vmm_log = (struct vmm_log_t *)KVM_VMM_LOG_BASE;
+ unsigned int slot;
+ va_list args;
+ int r;
+
+ vmm_spin_lock(&vmm_log->log_lock);
+ slot = vmm_log->w_pointer % (VMM_LOG_SIZE/BYTES_PER_LOG);
+ memset(vmm_log->log_slot[slot], 0, BYTES_PER_LOG - 1);
+ va_start(args, fmt);
+ r = vsnprintf(vmm_log->log_slot[slot], BYTES_PER_LOG - 1, fmt, args);
+ va_end(args);
+ vmm_log->w_pointer++;
+ wmb();
+ vmm_spin_unlock(&vmm_log->log_lock);
+
+ return r;
+}
+
module_init(kvm_vmm_init)
module_exit(kvm_vmm_exit)
--
1.5.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel modules.
2008-09-06 4:03 [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel modules Zhang, Xiantao
@ 2008-10-07 13:19 ` Avi Kivity
2008-10-07 23:26 ` Zhang, Xiantao
0 siblings, 1 reply; 3+ messages in thread
From: Avi Kivity @ 2008-10-07 13:19 UTC (permalink / raw)
To: Zhang, Xiantao; +Cc: kvm-ia64, Avi Kivity, kvm
Zhang, Xiantao wrote:
> From 664b02928d8243def2acabe99b33eb5fad77bad1 Mon Sep 17 00:00:00 2001
> From: Xiantao Zhang <xiantao.zhang@intel.com>
> Date: Fri, 5 Sep 2008 11:04:24 +0800
> Subject: [PATCH] kvm/ia64: Add printk support for kvm-intel modules.
>
> Since this module will be reloated to an isolated address
> space from host side, so kvm-intel can't call printk of host
> kernel. This patch implements the printk function for kvm-intel
> module, so it doesn't need to suffer no-printk pains.
>
>
> +#define BYTES_PER_LOG 1024
>
Please drop this and make log records variable size.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel modules.
2008-10-07 13:19 ` Avi Kivity
@ 2008-10-07 23:26 ` Zhang, Xiantao
0 siblings, 0 replies; 3+ messages in thread
From: Zhang, Xiantao @ 2008-10-07 23:26 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm-ia64, Avi Kivity, kvm
Okay, I will modify it to use variable size.
-----Original Message-----
From: Avi Kivity [mailto:avi@redhat.com]
Sent: Tuesday, October 07, 2008 9:19 PM
To: Zhang, Xiantao
Cc: kvm-ia64@vger.kernel.org; Avi Kivity; kvm@vger.kernel.org
Subject: Re: [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel
modules.
Zhang, Xiantao wrote:
> From 664b02928d8243def2acabe99b33eb5fad77bad1 Mon Sep 17 00:00:00 2001
> From: Xiantao Zhang <xiantao.zhang@intel.com>
> Date: Fri, 5 Sep 2008 11:04:24 +0800
> Subject: [PATCH] kvm/ia64: Add printk support for kvm-intel modules.
>
> Since this module will be reloated to an isolated address
> space from host side, so kvm-intel can't call printk of host
> kernel. This patch implements the printk function for kvm-intel
> module, so it doesn't need to suffer no-printk pains.
>
>
> +#define BYTES_PER_LOG 1024
>
Please drop this and make log records variable size.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-10-07 23:26 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-06 4:03 [PATCH][1/3] kvm/ia64: Add printk support for kvm-intel modules Zhang, Xiantao
2008-10-07 13:19 ` Avi Kivity
2008-10-07 23:26 ` Zhang, Xiantao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).