Correct parsing of the buffer returned from ibm,update-properties. The first
element is a length and the path to the property which is slightly different
from the list of properties in the buffer so we need to specifically
handle this.

Signed-off-by: Nathan Fontenot <nf...@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/pseries/mobility.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

Index: powerpc/arch/powerpc/platforms/pseries/mobility.c
===================================================================
--- powerpc.orig/arch/powerpc/platforms/pseries/mobility.c      2013-04-17 
13:27:23.000000000 -0500
+++ powerpc/arch/powerpc/platforms/pseries/mobility.c   2013-04-17 
13:28:58.000000000 -0500
@@ -135,6 +135,7 @@
        char *prop_data;
        char *rtas_buf;
        int update_properties_token;
+       u32 vd;
 
        update_properties_token = rtas_token("ibm,update-properties");
        if (update_properties_token == RTAS_UNKNOWN_SERVICE)
@@ -161,13 +162,24 @@
 
                prop_data = rtas_buf + sizeof(*upwa);
 
-               for (i = 0; i < upwa->nprops; i++) {
+               /* The first element of the buffer is the path of the node
+                * being updated in the form of a 8 byte string length
+                * followed by the string. Skip past this to get to the
+                * properties being updated.
+                */
+               vd = *prop_data++;
+               prop_data += vd;
+
+               /* The path we skipped over is counted as one of the elements
+                * returned so start counting at one.
+                */
+               for (i = 1; i < upwa->nprops; i++) {
                        char *prop_name;
-                       u32 vd;
 
-                       prop_name = prop_data + 1;
+                       prop_name = prop_data;
                        prop_data += strlen(prop_name) + 1;
-                       vd = *prop_data++;
+                       vd = *(u32 *)prop_data;
+                       prop_data += sizeof(vd);
 
                        switch (vd) {
                        case 0x00000000:

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to