From e3be94d599e4a779ca656d5b0785e9753a4a121e Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Sat, 3 May 2025 08:29:38 +0200 Subject: [PATCH] feat(core): add pm_get_events syscall [no changelog] --- core/embed/sys/syscall/stm32/syscall_dispatch.c | 5 +++++ core/embed/sys/syscall/stm32/syscall_numbers.h | 1 + core/embed/sys/syscall/stm32/syscall_stubs.c | 5 +++++ core/embed/sys/syscall/stm32/syscall_verifiers.c | 16 ++++++++++++++++ core/embed/sys/syscall/stm32/syscall_verifiers.h | 2 ++ 5 files changed, 29 insertions(+) diff --git a/core/embed/sys/syscall/stm32/syscall_dispatch.c b/core/embed/sys/syscall/stm32/syscall_dispatch.c index d2ab1c9eeb..c0cb130514 100644 --- a/core/embed/sys/syscall/stm32/syscall_dispatch.c +++ b/core/embed/sys/syscall/stm32/syscall_dispatch.c @@ -745,6 +745,11 @@ __attribute((no_stack_protector)) void syscall_handler(uint32_t *args, pm_state_t *status = (pm_state_t *)args[0]; args[0] = pm_get_state__verified(status); } + + case SYSCALL_POWER_MANAGER_GET_EVENTS: { + pm_event_t *status = (pm_event_t *)args[0]; + args[0] = pm_get_events__verified(status); + } #endif #ifdef USE_HW_JPEG_DECODER diff --git a/core/embed/sys/syscall/stm32/syscall_numbers.h b/core/embed/sys/syscall/stm32/syscall_numbers.h index c999707cc9..d2a9da8f93 100644 --- a/core/embed/sys/syscall/stm32/syscall_numbers.h +++ b/core/embed/sys/syscall/stm32/syscall_numbers.h @@ -152,6 +152,7 @@ typedef enum { SYSCALL_POWER_MANAGER_SUSPEND, SYSCALL_POWER_MANAGER_HIBERNATE, SYSCALL_POWER_MANAGER_GET_STATE, + SYSCALL_POWER_MANAGER_GET_EVENTS, SYSCALL_JPEGDEC_OPEN, SYSCALL_JPEGDEC_CLOSE, diff --git a/core/embed/sys/syscall/stm32/syscall_stubs.c b/core/embed/sys/syscall/stm32/syscall_stubs.c index 9cb20c820a..d5b60650c5 100644 --- a/core/embed/sys/syscall/stm32/syscall_stubs.c +++ b/core/embed/sys/syscall/stm32/syscall_stubs.c @@ -700,6 +700,11 @@ pm_status_t pm_get_status(pm_state_t *status) { SYSCALL_POWER_MANAGER_GET_STATE); } +bool pm_get_events(pm_event_t *events) { + return (bool)syscall_invoke1((uint32_t)events, + SYSCALL_POWER_MANAGER_GET_EVENTS); +} + #endif // USE_POWER_MANAGER // ============================================================================= diff --git a/core/embed/sys/syscall/stm32/syscall_verifiers.c b/core/embed/sys/syscall/stm32/syscall_verifiers.c index 6c7fd39928..9c4ae6fc73 100644 --- a/core/embed/sys/syscall/stm32/syscall_verifiers.c +++ b/core/embed/sys/syscall/stm32/syscall_verifiers.c @@ -835,6 +835,22 @@ access_violation: return PM_ERROR; } +bool pm_get_events__verified(pm_event_t *event) { + if (!probe_write_access(event, sizeof(*event))) { + goto access_violation; + } + + pm_event_t event_copy = {0}; + bool retval = pm_get_events(&event_copy); + *event = event_copy; + + return retval; + +access_violation: + apptask_access_violation(); + return false; +} + #endif // --------------------------------------------------------------------- diff --git a/core/embed/sys/syscall/stm32/syscall_verifiers.h b/core/embed/sys/syscall/stm32/syscall_verifiers.h index 77b99e473d..0ba21ed9b2 100644 --- a/core/embed/sys/syscall/stm32/syscall_verifiers.h +++ b/core/embed/sys/syscall/stm32/syscall_verifiers.h @@ -215,6 +215,8 @@ secbool ble_read__verified(uint8_t *data, size_t len); pm_status_t pm_get_state__verified(pm_state_t *status); +bool pm_get_events__verified(pm_event_t *event); + #endif // ---------------------------------------------------------------------