aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasant Hegde <hegdevasant@linux.vnet.ibm.com>2019-05-28 11:17:27 +0530
committerVasant Hegde <hegdevasant@linux.vnet.ibm.com>2019-06-08 15:04:28 +0530
commit2fff264e25d2349a92d84b02e14c886121d90410 (patch)
treeb64d03bf807f312d451209c0dacd97f913b5c76e
parentc4f9c112fc172d19acdc9143045d5c745eb1b4de (diff)
downloadskiboot-2fff264e25d2349a92d84b02e14c886121d90410.zip
skiboot-2fff264e25d2349a92d84b02e14c886121d90410.tar.gz
skiboot-2fff264e25d2349a92d84b02e14c886121d90410.tar.bz2
opal-prd: Fix prd message size issue
[ Upstream commit 9cae036fafea468219892406a846639f2715854d ] If prd messages size is insufficient then read_prd_msg() call fails with below error. And caller is not reallocating sufficient buffer. Also its hard to guess the size. sample log: ----------- Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument Mar 28 03:31:43 zz24p1 opal-prd: FW: error reading from firmware: alloc 32 rc -1: Invalid argument .... Lets use `opal-msg-size` device tree property to allocate memory for prd message. Cc: Skiboot Stable <skiboot-stable@lists.ozlabs.org> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r--external/opal-prd/opal-prd.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c
index 33ea5f5..d0a507c 100644
--- a/external/opal-prd/opal-prd.c
+++ b/external/opal-prd/opal-prd.c
@@ -2120,7 +2120,9 @@ static int init_control_socket(struct opal_prd_ctx *ctx)
static int run_prd_daemon(struct opal_prd_ctx *ctx)
{
- int rc;
+ char *opal_msg_path;
+ void *buf;
+ int rc, len;
/* log to syslog */
pr_log_daemon_init();
@@ -2130,14 +2132,31 @@ static int run_prd_daemon(struct opal_prd_ctx *ctx)
ctx->fd = -1;
ctx->socket = -1;
- /* set up our message buffer */
- ctx->msg_alloc_len = sizeof(*ctx->msg);
+ /*
+ * Set up our message buffer. Use opal-msg-size device tree
+ * property to get message buffer size.
+ */
+ rc = asprintf(&opal_msg_path,
+ "%s/ibm,opal/opal-msg-size", devicetree_base);
+ if (rc > 0) {
+ rc = open_and_read(opal_msg_path, &buf, &len);
+ if (rc == 0) {
+ ctx->msg_alloc_len = be32toh(*(__be32 *)buf);
+ free(buf);
+ }
+
+ free(opal_msg_path);
+ }
+
+ if (ctx->msg_alloc_len == 0)
+ ctx->msg_alloc_len = sizeof(*ctx->msg);
+
ctx->msg = malloc(ctx->msg_alloc_len);
if (!ctx->msg) {
pr_log(LOG_ERR, "FW: Can't allocate PRD message buffer: %m");
return -1;
}
-
+ memset(ctx->msg, 0, ctx->msg_alloc_len);
list_head_init(&ctx->msgq);