qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] qemu patch for adding functionality to rtas_ibm_get_system_


From: Tomohiro B Berry
Subject: [Qemu-devel] qemu patch for adding functionality to rtas_ibm_get_system_parameter
Date: Wed, 12 Mar 2014 10:50:57 -0500

Hi all,

rtas_ibm_get_system_parameter did not previously have the functionality to return the appropriate string when called with the SPLPAR_CHARACTERISTICS_TOKEN.  I am proposing the following patch to add that functionality.  I am including the cases for CMO_CHARACTERISTICS_TOKEN and CEDE_LATENCY_TOKEN because the function gets called with those tokens during the boot process, but I understand that they are currently redundant with the default case.  I just figured they would be useful for future development, but if we don't want them in there right now I think that would be okay, too.  

Regards,

Tomo Berry

diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c

index 1cb276d..318fdcd 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -225,6 +225,9 @@ static void rtas_stop_self(PowerPCCPU *cpu, sPAPREnvironment *spapr,
 }
 
 #define DIAGNOSTICS_RUN_MODE        42
+#define SPLPAR_CHARACTERISTICS_TOKEN 20
+#define CMO_CHARACTERISTICS_TOKEN 44
+#define CEDE_LATENCY_TOKEN 45
 
 static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
                                           sPAPREnvironment *spapr,
@@ -236,6 +239,7 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
     target_ulong buffer = rtas_ld(args, 1);
     target_ulong length = rtas_ld(args, 2);
     target_ulong ret = RTAS_OUT_NOT_SUPPORTED;
+    char *local_buffer;
 
     switch (parameter) {
     case DIAGNOSTICS_RUN_MODE:
@@ -244,6 +248,42 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
             ret = RTAS_OUT_SUCCESS;
         }
         break;
+    case SPLPAR_CHARACTERISTICS_TOKEN:
+
+        /*  Create a string locally to copy to buffer  */
+        
+        local_buffer=(char*)malloc(length*sizeof(char));
+        memset(local_buffer,0,length);
+
+        /*  These are the current system parameters supported.  The spaces at the
+         *  start of the string are place holders for the string length. */
+
+        snprintf(local_buffer,length,"  MaxEntCap=%d,MaxPlatProcs=%d",max_cpus,smp_cpus);
+
+        /*  The first 16 bits of the buffer must contain the length of the string.
+         *  These 16 bits are not included in the length of the string. */
+        
+        ((uint16_t*)local_buffer)[0]=cpu_to_be16((uint16_t)strlen(&local_buffer[2]));
+        
+        /*  Copy the string into buffer using rtas_st_buffer to
+         *  convert the addresses. */
+        
+        rtas_st_buffer(buffer,length,(uint8_t*)local_buffer);
+
+        /*  Free the local buffer and return success. */        
+        
+        free(local_buffer);
+        ret = RTAS_OUT_SUCCESS;
+        break;
+    case CMO_CHARACTERISTICS_TOKEN:
+        ret = RTAS_OUT_NOT_SUPPORTED;
+        break;
+    case CEDE_LATENCY_TOKEN:
+        ret = RTAS_OUT_NOT_SUPPORTED;
+        break;
+    default:
+        ret = RTAS_OUT_NOT_SUPPORTED;
+        break;
     }
 
     rtas_st(rets, 0, ret);
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index b2f11e9..87c039c 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -356,6 +356,16 @@ static inline void rtas_st(target_ulong phys, int n, uint32_t val)
     stl_be_phys(ppc64_phys_to_real(phys + 4*n), val);
 }
 
+/*  This function will store a buffer 1 byte at a time into the
+ *  address at phys up to a maximum of phys_len bytes. */
+
+static inline void rtas_st_buffer(target_ulong phys, target_ulong phys_len, uint8_t* buffer){
+    uint32_t i;
+    for(i=0;i<phys_len;i++){
+        stb_phys(ppc64_phys_to_real(phys + i),buffer[i]);
+    }
+}
+
 typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, sPAPREnvironment *spapr,
                               uint32_t token,
                               uint32_t nargs, target_ulong args,
diff --git a/pixman b/pixman
--- a/pixman
+++ b/pixman
@@ -1 +1 @@
-Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3
+Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3-dirty
reply via email to

[Prev in Thread] Current Thread [Next in Thread]