diff options
Diffstat (limited to 'zephyr')
-rw-r--r-- | zephyr/shim/include/zephyr_hooks_shim.h | 10 | ||||
-rw-r--r-- | zephyr/shim/src/hooks.c | 13 |
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; |