Patchwork [06/15] Implement missing parts of the logic for the POWER PURR

login
register
mail settings
Submitter David Gibson
Date Feb. 12, 2011, 2:54 p.m.
Message ID <1297522467-5975-7-git-send-email-david@gibson.dropbear.id.au>
Download mbox | patch
Permalink /patch/82919/
State New
Headers show

Comments

David Gibson - Feb. 12, 2011, 2:54 p.m.
From: David Gibson <dwg@au1.ibm.com>

The PURR (Processor Utilization Resource Register) is a register found
on recent POWER CPUs.  The guts of implementing it at least enough to
get by are already present in qemu, however some of the helper
functions needed to actually wire it up are missing.

This patch adds the necessary glue, so that the PURR can be wired up
when we implement newer POWER CPU targets which include it.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---
 target-ppc/helper.h         |    1 +
 target-ppc/op_helper.c      |    5 +++++
 target-ppc/translate_init.c |    6 ++++++
 3 files changed, 12 insertions(+), 0 deletions(-)
Alexander Graf - Feb. 12, 2011, 3:25 p.m.
On 12.02.2011, at 15:54, David Gibson wrote:

> From: David Gibson <dwg@au1.ibm.com>
> 
> The PURR (Processor Utilization Resource Register) is a register found
> on recent POWER CPUs.  The guts of implementing it at least enough to
> get by are already present in qemu, however some of the helper
> functions needed to actually wire it up are missing.
> 
> This patch adds the necessary glue, so that the PURR can be wired up
> when we implement newer POWER CPU targets which include it.
> 
> Signed-off-by: David Gibson <dwg@au1.ibm.com>

Yay, so we can finally emulate POWER5 guests :). Please keep in mind that PURR is also missing in kvm code.

Acked-by: Alexander Graf <agraf@suse.de>


Alex

Patch

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 1a69cf8..4227897 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -371,6 +371,7 @@  DEF_HELPER_0(load_tbl, tl)
 DEF_HELPER_0(load_tbu, tl)
 DEF_HELPER_0(load_atbl, tl)
 DEF_HELPER_0(load_atbu, tl)
+DEF_HELPER_0(load_purr, tl)
 DEF_HELPER_0(load_601_rtcl, tl)
 DEF_HELPER_0(load_601_rtcu, tl)
 #if !defined(CONFIG_USER_ONLY)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index bdb1f17..b9b5ae2 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -86,6 +86,11 @@  target_ulong helper_load_atbu (void)
     return cpu_ppc_load_atbu(env);
 }
 
+target_ulong helper_load_purr (void)
+{
+    return (target_ulong)cpu_ppc_load_purr(env);
+}
+
 target_ulong helper_load_601_rtcl (void)
 {
     return cpu_ppc601_load_rtcl(env);
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index dfcd949..c842330 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -209,6 +209,12 @@  static void spr_write_atbu (void *opaque, int sprn, int gprn)
 {
     gen_helper_store_atbu(cpu_gpr[gprn]);
 }
+
+__attribute__ (( unused ))
+static void spr_read_purr(void *opaque, int gprn, int sprn)
+{
+    gen_helper_load_purr(cpu_gpr[gprn]);
+}
 #endif
 
 #if !defined(CONFIG_USER_ONLY)