summaryrefslogtreecommitdiff
path: root/zephyr
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr')
-rw-r--r--zephyr/shim/include/zephyr_hooks_shim.h10
-rw-r--r--zephyr/shim/src/hooks.c13
2 files changed, 16 insertions, 7 deletions
diff --git a/zephyr/shim/include/zephyr_hooks_shim.h b/zephyr/shim/include/zephyr_hooks_shim.h
index 3bb0854b21..e19f311af5 100644
--- a/zephyr/shim/include/zephyr_hooks_shim.h
+++ b/zephyr/shim/include/zephyr_hooks_shim.h
@@ -25,21 +25,25 @@ struct deferred_data {
/**
* See include/hooks.h for documentation.
*/
-int hook_call_deferred(struct deferred_data *data, int us);
+int hook_call_deferred(const struct deferred_data *data, int us);
/**
* Runtime helper to setup deferred data.
*
* @param data The struct deferred_data.
*/
-void zephyr_shim_setup_deferred(struct deferred_data *data);
+void zephyr_shim_setup_deferred(const struct deferred_data *data);
/**
* See include/hooks.h for documentation.
+ *
+ * Typically Zephyr would put const data in the rodata section but that is
+ * write-protected with native_posix. So force it into .data instead.
*/
#define DECLARE_DEFERRED(routine) _DECLARE_DEFERRED(routine)
#define _DECLARE_DEFERRED(_routine) \
- static __maybe_unused struct deferred_data _routine##_data = { \
+ __maybe_unused const struct deferred_data _routine##_data \
+ __attribute__((section(".data.hooks"))) = { \
.routine = _routine, \
}; \
static int _setup_deferred_##_routine(const struct device *unused) \
diff --git a/zephyr/shim/src/hooks.c b/zephyr/shim/src/hooks.c
index 5011ed79ea..e4b1ea8791 100644
--- a/zephyr/shim/src/hooks.c
+++ b/zephyr/shim/src/hooks.c
@@ -42,17 +42,22 @@ static int init_deferred_work_queue(const struct device *unused)
}
SYS_INIT(init_deferred_work_queue, APPLICATION, 0);
-void zephyr_shim_setup_deferred(struct deferred_data *data)
+void zephyr_shim_setup_deferred(const struct deferred_data *data)
{
- k_delayed_work_init(&data->delayed_work, deferred_work_queue_handler);
+ struct deferred_data *non_const = (struct deferred_data *)data;
+
+ k_delayed_work_init(&non_const->delayed_work,
+ deferred_work_queue_handler);
}
-int hook_call_deferred(struct deferred_data *data, int us)
+int hook_call_deferred(const struct deferred_data *data, int us)
{
+ struct deferred_data *non_const = (struct deferred_data *)data;
int rv;
rv = k_delayed_work_submit_to_queue(&deferred_work_queue,
- &data->delayed_work, K_USEC(us));
+ &non_const->delayed_work,
+ K_USEC(us));
if (rv < 0)
cprints(CC_HOOK, "Warning: deferred call not submitted.");
return rv;