Kernel KVM-PPC virtualization development
 help / color / mirror / Atom feed
* [kvm-ppc-devel] [PATCH] [2/4] Add per guest pvr (userspace)
@ 2008-01-30 12:31 ehrhardt
  2008-01-31 14:56 ` ehrhardt
  0 siblings, 1 reply; 2+ messages in thread
From: ehrhardt @ 2008-01-30 12:31 UTC (permalink / raw)
  To: kvm-ppc

Subject: [PATCH] [2/4] Add per guest pvr (userspace)
From: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>

This adds a per VM variable called pvr in imitation of the hardware spr. It
also adds a interface to get/set this variable to the vm ioctl. Atm it uses
non-real pvr values to allow us to differ on runtime e.g. between ppc440 and
e500 guests.

Signed-off-by: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
---

 libkvm/libkvm-powerpc.c |   21 ++++++++++++++++++++-
 libkvm/libkvm.h         |    4 ++++
 qemu/vl.c               |    7 +++++++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/libkvm/libkvm-powerpc.c b/libkvm/libkvm-powerpc.c
--- a/libkvm/libkvm-powerpc.c
+++ b/libkvm/libkvm-powerpc.c
@@ -25,6 +25,10 @@
 #include "kvm-powerpc.h"
 #include <errno.h>
 #include <stdio.h>
+#include <sys/ioctl.h>
+
+/* need to be available prior to kvm_arch_create and prior to qemu env setup */
+static struct kvm_pvr kvm_guest_pvr;
 
 int handle_dcr(struct kvm_run *run,  kvm_context_t kvm, int vcpu)
 {
@@ -85,10 +89,25 @@ void kvm_show_regs(kvm_context_t kvm, in
 	fflush(stdout);
 }
 
+void kvm_init_guest_pvr(uint32_t guest_pvr)
+{
+	kvm_guest_pvr.pvr = guest_pvr;
+}
+
 int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
 			 void **vm_mem)
 {
-	return 0;
+	int r = 0;
+
+	if (kvm_guest_pvr.pvr = 0)
+		/* we might want to set a useful default here */
+		fprintf(stderr, "%s warning - pvr not set\n", __func__);
+
+	r = ioctl(kvm->vm_fd, KVM_SET_GUEST_PVR, &kvm_guest_pvr);
+	if (r)
+		fprintf(stderr, "%s failed (r='%d')\n", __func__, r);
+
+	return r;
 }
 
 int kvm_arch_create_default_phys_mem(kvm_context_t kvm,
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -556,4 +556,8 @@ int kvm_enable_vapic(kvm_context_t kvm, 
 
 #endif
 
+#if defined(__powerpc__)
+void kvm_init_guest_pvr(uint32_t guest_pvr);
 #endif
+
+#endif
diff --git a/qemu/vl.c b/qemu/vl.c
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -9319,6 +9319,13 @@ int main(int argc, char **argv)
 #else
 #define KVM_EXTRA_PAGES 0
 #endif
+
+#ifdef TARGET_PPC
+/* initialize wanted pvr in libkvm prior to first create call */
+if (machine = &bamboo_machine)
+	kvm_init_guest_pvr(KVM_PPC_PVR_PPC44X);
+#endif
+
     if (kvm_allowed) {
 	    phys_ram_size += KVM_EXTRA_PAGES * TARGET_PAGE_SIZE;
 	    if (kvm_qemu_create_context() < 0) {

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-ppc-devel mailing list
kvm-ppc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-ppc-devel

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [kvm-ppc-devel] [PATCH] [2/4] Add per guest pvr (userspace)
  2008-01-30 12:31 [kvm-ppc-devel] [PATCH] [2/4] Add per guest pvr (userspace) ehrhardt
@ 2008-01-31 14:56 ` ehrhardt
  0 siblings, 0 replies; 2+ messages in thread
From: ehrhardt @ 2008-01-31 14:56 UTC (permalink / raw)
  To: kvm-ppc

From: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>

This adds a per vcpu interface to get/set the the pvr.
The current patch sets the pvr for a PPC440EP when the selected guest type
is a bamboo machine.

Signed-off-by: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
---

 libkvm/libkvm-powerpc.c |   21 +++++++++++++++++++++
 libkvm/libkvm.h         |    4 ++++
 qemu/hw/ppc440_bamboo.c |    1 +
 qemu/qemu-kvm-powerpc.c |    5 +++++
 qemu/qemu-kvm.h         |    1 +
 qemu/vl.c               |    1 +
 6 files changed, 33 insertions(+)

diff --git a/libkvm/libkvm-powerpc.c b/libkvm/libkvm-powerpc.c
--- a/libkvm/libkvm-powerpc.c
+++ b/libkvm/libkvm-powerpc.c
@@ -25,6 +25,7 @@
 #include "kvm-powerpc.h"
 #include <errno.h>
 #include <stdio.h>
+#include <sys/ioctl.h>
 
 int handle_dcr(struct kvm_run *run,  kvm_context_t kvm, int vcpu)
 {
@@ -85,6 +86,30 @@ void kvm_show_regs(kvm_context_t kvm, in
 	fflush(stdout);
 }
 
+int kvm_get_guest_pvr(kvm_context_t kvm, int vcpu)
+{
+	int r = 0;
+	struct kvm_pvr kvm_guest_pvr;
+
+	r = ioctl(kvm->vcpu_fd[vcpu], KVM_GET_GUEST_PVR, &kvm_guest_pvr);
+	if (r)
+		fprintf(stderr, "%s failed (r='%d')\n", __func__, r);
+
+
+	return kvm_guest_pvr.pvr;
+}
+
+void kvm_set_guest_pvr(kvm_context_t kvm, uint32_t guest_pvr, int vcpu)
+{
+	int r = 0;
+	struct kvm_pvr kvm_guest_pvr;
+	kvm_guest_pvr.pvr = guest_pvr;
+
+	r = ioctl(kvm->vcpu_fd[vcpu], KVM_SET_GUEST_PVR, &kvm_guest_pvr);
+	if (r)
+		fprintf(stderr, "%s failed (r='%d')\n", __func__, r);
+}
+
 int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
 			 void **vm_mem)
 {
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -556,4 +556,8 @@ int kvm_enable_vapic(kvm_context_t kvm, 
 
 #endif
 
+#if defined(__powerpc__)
+void kvm_set_guest_pvr(kvm_context_t kvm, uint32_t guest_pvr, int vcpu);
 #endif
+
+#endif
diff --git a/qemu/hw/ppc440_bamboo.c b/qemu/hw/ppc440_bamboo.c
--- a/qemu/hw/ppc440_bamboo.c
+++ b/qemu/hw/ppc440_bamboo.c
@@ -102,6 +102,7 @@ void bamboo_init(ram_addr_t ram_size, in
 	}
 
 #if USE_KVM
+	set_guest_pvr(KVM_PPC_PVR_PPC440EP, env);
 	/* XXX insert TLB entries */
 	env->gpr[1] = (16<<20) - 8;
 	env->gpr[4] = initrd_base;
diff --git a/qemu/qemu-kvm-powerpc.c b/qemu/qemu-kvm-powerpc.c
--- a/qemu/qemu-kvm-powerpc.c
+++ b/qemu/qemu-kvm-powerpc.c
@@ -194,4 +194,9 @@ int handle_powerpc_dcr_write(int vcpu, u
     return 0; /* XXX ignore failed DCR ops */
 }
 
+void set_guest_pvr(uint32_t guest_pvr, CPUState *env)
+{
+	kvm_set_guest_pvr(kvm_context, guest_pvr, env->cpu_index);
+}
+
 #endif
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -57,6 +57,7 @@ int handle_tpr_access(void *opaque, int 
 #ifdef TARGET_PPC
 int handle_powerpc_dcr_read(int vcpu, uint32_t dcrn, uint32_t *data);
 int handle_powerpc_dcr_write(int vcpu,uint32_t dcrn, uint32_t data);
+void set_guest_pvr(uint32_t guest_pvr, CPUState *env);
 #endif
 
 #define ALIGN(x, y)  (((x)+(y)-1) & ~((y)-1))

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-ppc-devel mailing list
kvm-ppc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-ppc-devel

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-01-31 14:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-30 12:31 [kvm-ppc-devel] [PATCH] [2/4] Add per guest pvr (userspace) ehrhardt
2008-01-31 14:56 ` ehrhardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox