* [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