diff mbox

external/opal-prd: Ensure that struct host_interfaces matches the thunk

Message ID 1460601812-9730-1-git-send-email-jk@ozlabs.org
State Accepted
Headers show

Commit Message

Jeremy Kerr April 14, 2016, 2:43 a.m. UTC
Currently, we don't describe the reserved area at the end of struct
host_interfaces; it's in the thunk, but not the struct itself.

This change adds the reserved area, and adds a set of runtime asserts to
ensure that the struct layout matches the thunk.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
---
 external/opal-prd/hostboot-interface.h |  3 ++-
 external/opal-prd/opal-prd.c           | 20 ++++++++++++++++++++
 external/opal-prd/thunk.S              |  6 ++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

Comments

Balbir Singh April 18, 2016, 4:41 a.m. UTC | #1
On 14/04/16 12:43, Jeremy Kerr wrote:
> Currently, we don't describe the reserved area at the end of struct
> host_interfaces; it's in the thunk, but not the struct itself.
> 
> This change adds the reserved area, and adds a set of runtime asserts to
> ensure that the struct layout matches the thunk.
> 

Seems like a good idea! Should we check for deadbeef @__hinterface_end?

Balbir Singh
Jeremy Kerr April 18, 2016, 4:49 a.m. UTC | #2
Hi Balbir,

>> Currently, we don't describe the reserved area at the end of struct
>> host_interfaces; it's in the thunk, but not the struct itself.
>>
>> This change adds the reserved area, and adds a set of runtime asserts to
>> ensure that the struct layout matches the thunk.
>>
> 
> Seems like a good idea! Should we check for deadbeef @__hinterface_end?

The 0xdeadbeef marker isn't really part of the ABI (just a hint for
debugging), so I don't think we need to enforce its presence.

Cheers,


Jeremy
Balbir Singh April 18, 2016, 5:06 a.m. UTC | #3
On 18/04/16 14:49, Jeremy Kerr wrote:
> Hi Balbir,
> 
>>> Currently, we don't describe the reserved area at the end of struct
>>> host_interfaces; it's in the thunk, but not the struct itself.
>>>
>>> This change adds the reserved area, and adds a set of runtime asserts to
>>> ensure that the struct layout matches the thunk.
>>>
>>
>> Seems like a good idea! Should we check for deadbeef @__hinterface_end?
> 
> The 0xdeadbeef marker isn't really part of the ABI (just a hint for
> debugging), so I don't think we need to enforce its presence.

Fair enough

Acked-by: Balbir Singh <bsingharora@gmail.com>
Stewart Smith April 18, 2016, 8:31 p.m. UTC | #4
Jeremy Kerr <jk@ozlabs.org> writes:
> Currently, we don't describe the reserved area at the end of struct
> host_interfaces; it's in the thunk, but not the struct itself.
>
> This change adds the reserved area, and adds a set of runtime asserts to
> ensure that the struct layout matches the thunk.
>
> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>

Merged to master as of 41a064e
diff mbox

Patch

diff --git a/external/opal-prd/hostboot-interface.h b/external/opal-prd/hostboot-interface.h
index 0d268d3..0393152 100644
--- a/external/opal-prd/hostboot-interface.h
+++ b/external/opal-prd/hostboot-interface.h
@@ -277,7 +277,8 @@  struct host_interfaces {
 	int (*memory_error)( uint64_t i_startAddr, uint64_t i_endAddr,
 					  enum MemoryError_t i_errorType );
 
-
+	/* Reserve some space for future growth. */
+	void (*reserved[32])(void);
 };
 
 struct runtime_interfaces {
diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c
index 7c11c9a..d3dbc16 100644
--- a/external/opal-prd/opal-prd.c
+++ b/external/opal-prd/opal-prd.c
@@ -221,6 +221,24 @@  static void pr_log_daemon_init(void)
 	}
 }
 
+/**
+ * ABI check that we can't perform at build-time: we want to ensure that the
+ * layout of struct host_interfaces matches that defined in the thunk.
+ */
+static void check_abi(void)
+{
+	extern unsigned char __hinterface_start, __hinterface_pad,
+	       __hinterface_end;
+
+	/* ensure our struct size matches the thunk definition */
+	assert((&__hinterface_end - &__hinterface_start)
+			== sizeof(struct host_interfaces));
+
+	/* ensure the padding layout is as expected */
+	assert((void *)&__hinterface_start == (void *)&hinterface);
+	assert((void *)&__hinterface_pad == (void *)&hinterface.reserved);
+}
+
 /* HBRT init wrappers */
 extern struct runtime_interfaces *call_hbrt_init(struct host_interfaces *);
 
@@ -1960,6 +1978,8 @@  int main(int argc, char *argv[])
 	enum action action;
 	int rc;
 
+	check_abi();
+
 	ctx = &_ctx;
 	memset(ctx, 0, sizeof(*ctx));
 	ctx->vlog = pr_log_stdio;
diff --git a/external/opal-prd/thunk.S b/external/opal-prd/thunk.S
index 7549efc..f25afde 100644
--- a/external/opal-prd/thunk.S
+++ b/external/opal-prd/thunk.S
@@ -157,6 +157,8 @@  name##_thunk:									;\
 	 */
 	.data
 	.globl hinterface
+	.globl __hinterface_start
+__hinterface_start:
 hinterface:
 	/* HBRT interface version */
 	.llong 1
@@ -184,8 +186,12 @@  hinterface:
 	CALLBACK_THUNK(hservice_i2c_write)
 	CALLBACK_THUNK(hservice_ipmi_msg)
 	CALLBACK_THUNK(hservice_memory_error)
+.globl __hinterface_pad
+__hinterface_pad:
 	/* Reserved space for future growth */
 	.space 32*8,0
+.globl __hinterface_end
+__hinterface_end:
 	/* Eye catcher for debugging */
 	.llong 0xdeadbeef