Skip to content

Commit

Permalink
powerpc/pseries: Correct buffer parsing in update_dt_node()
Browse files Browse the repository at this point in the history
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 <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Nathan Fontenot authored and Benjamin Herrenschmidt committed Apr 26, 2013
1 parent 762ec15 commit 2e9b7b0
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions arch/powerpc/platforms/pseries/mobility.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ static int update_dt_node(u32 phandle, s32 scope)
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)
Expand All @@ -160,13 +161,24 @@ static int update_dt_node(u32 phandle, s32 scope)

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:
Expand Down

0 comments on commit 2e9b7b0

Please sign in to comment.