aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-12-08 22:23:02 +1000
committerOliver O'Halloran <oohall@gmail.com>2019-12-16 14:50:56 +1100
commit4ec92ececc15ac27f2837e41eae8a6e5431578e8 (patch)
tree51019be813ade0070ea9095e58d8b879d63e3871
parente3934d8c3f948300d346902467a8862a701a00bf (diff)
downloadskiboot-4ec92ececc15ac27f2837e41eae8a6e5431578e8.zip
skiboot-4ec92ececc15ac27f2837e41eae8a6e5431578e8.tar.gz
skiboot-4ec92ececc15ac27f2837e41eae8a6e5431578e8.tar.bz2
errorlog: endian conversion
Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
-rw-r--r--core/errorlog.c14
-rw-r--r--core/pel.c15
-rw-r--r--include/errorlog.h12
3 files changed, 24 insertions, 17 deletions
diff --git a/core/errorlog.c b/core/errorlog.c
index 01e2969..fd31683 100644
--- a/core/errorlog.c
+++ b/core/errorlog.c
@@ -93,10 +93,10 @@ void log_add_section(struct errorlog *buf, uint32_t tag)
tmp = (struct elog_user_data_section *)(buf->user_data_dump +
buf->user_section_size);
/* Use DESC if no other tag provided */
- tmp->tag = tag ? tag : 0x44455343;
- tmp->size = size;
+ tmp->tag = tag ? cpu_to_be32(tag) : cpu_to_be32(0x44455343);
+ tmp->size = cpu_to_be16(size);
- buf->user_section_size += tmp->size;
+ buf->user_section_size += size;
buf->user_section_count++;
}
@@ -133,6 +133,7 @@ void log_append_data(struct errorlog *buf, unsigned char *data, uint16_t size)
struct elog_user_data_section *section;
uint8_t n_sections;
char *buffer;
+ uint16_t ssize;
if (!buf) {
prerror("ELOG: Cannot update user data. Buffer is invalid\n");
@@ -154,13 +155,14 @@ void log_append_data(struct errorlog *buf, unsigned char *data, uint16_t size)
while (--n_sections) {
section = (struct elog_user_data_section *)buffer;
- buffer += section->size;
+ buffer += be16_to_cpu(section->size);
}
section = (struct elog_user_data_section *)buffer;
- buffer += section->size;
+ ssize = be16_to_cpu(section->size);
+ buffer += ssize;
memcpy(buffer, data, size);
- section->size += size;
+ section->size = cpu_to_be16(ssize + size);
buf->user_section_size += size;
}
diff --git a/core/pel.c b/core/pel.c
index b07ba0e..7f9abb8 100644
--- a/core/pel.c
+++ b/core/pel.c
@@ -211,16 +211,19 @@ static void create_user_defined_section(struct errorlog *elog_data,
opal_usr_data = (struct elog_user_data_section *)opal_buf;
usrhdr->v6header.id = ELOG_SID_USER_DEFINED;
+ usrhdr->v6header.length = cpu_to_be16(
+ sizeof(struct opal_v6_header) +
+ be16_to_cpu(opal_usr_data->size));
usrhdr->v6header.version = OPAL_ELOG_VERSION;
usrhdr->v6header.length = sizeof(struct opal_v6_header) +
opal_usr_data->size;
usrhdr->v6header.subtype = OPAL_ELOG_SST;
usrhdr->v6header.component_id = elog_data->component_id;
- memcpy(usrhdr->dump, opal_buf, opal_usr_data->size);
+ memcpy(usrhdr->dump, opal_buf, be16_to_cpu(opal_usr_data->size));
*pel_offset += usrhdr->v6header.length;
dump += usrhdr->v6header.length;
- opal_buf += opal_usr_data->size;
+ opal_buf += be16_to_cpu(opal_usr_data->size);
privhdr->section_count++;
}
}
@@ -233,10 +236,12 @@ static size_t pel_user_section_size(struct errorlog *elog_data)
struct elog_user_data_section *opal_usr_data;
for (i = 0; i < elog_data->user_section_count; i++) {
+ u16 s;
+
opal_usr_data = (struct elog_user_data_section *)opal_buf;
- total += sizeof(struct opal_v6_header) +
- opal_usr_data->size;
- opal_buf += opal_usr_data->size;
+ s = be16_to_cpu(opal_usr_data->size);
+ total += sizeof(struct opal_v6_header) + s;
+ opal_buf += s;
}
return total;
diff --git a/include/errorlog.h b/include/errorlog.h
index 3fd475c..a01ab97 100644
--- a/include/errorlog.h
+++ b/include/errorlog.h
@@ -94,19 +94,19 @@
#define ORG_POWERNV 2
/* Multiple user data sections */
-struct __attribute__((__packed__))elog_user_data_section {
- uint32_t tag;
- uint16_t size;
- uint16_t component_id;
+struct elog_user_data_section {
+ __be32 tag;
+ __be16 size;
+ __be16 component_id;
char data_dump[1];
-};
+} __packed;
/*
* All the information regarding an error/event to be reported
* needs to populate this structure using pre-defined interfaces
* only
*/
-struct __attribute__((__packed__)) __attribute__ ((aligned (8))) errorlog {
+struct errorlog {
uint16_t component_id;
uint8_t error_event_type;