diff --git a/os/sb/host/sbvrq.c b/os/sb/host/sbvrq.c index 7e55d6127..94ddadf5c 100644 --- a/os/sb/host/sbvrq.c +++ b/os/sb/host/sbvrq.c @@ -216,34 +216,42 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) { void sb_api_vrq_setwt(struct port_extctx *ectxp) { sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; + uint32_t m; + m = ectxp->r0; ectxp->r0 = sbp->vrq_wtmask; - sbp->vrq_wtmask |= ectxp->r0; + sbp->vrq_wtmask |= m; vrq_check_trigger(sbp, ectxp); } void sb_api_vrq_clrwt(struct port_extctx *ectxp) { sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; + uint32_t m; + m = ectxp->r0; ectxp->r0 = sbp->vrq_wtmask; - sbp->vrq_wtmask &= ~ectxp->r0; + sbp->vrq_wtmask &= ~m; } void sb_api_vrq_seten(struct port_extctx *ectxp) { sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; + uint32_t m; + m = ectxp->r0; ectxp->r0 = sbp->vrq_enmask; - sbp->vrq_enmask |= ectxp->r0; + sbp->vrq_enmask |= m; vrq_check_trigger(sbp, ectxp); } void sb_api_vrq_clren(struct port_extctx *ectxp) { sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; + uint32_t m; + m = ectxp->r0; ectxp->r0 = sbp->vrq_enmask; - sbp->vrq_enmask &= ~ectxp->r0; + sbp->vrq_enmask &= ~m; } void sb_api_vrq_disable(struct port_extctx *ectxp) { diff --git a/os/sb/user/sbuser.h b/os/sb/user/sbuser.h index 5e961116a..0c220a167 100644 --- a/os/sb/user/sbuser.h +++ b/os/sb/user/sbuser.h @@ -191,6 +191,13 @@ typedef uint32_t eventflags_t; "r" (r2), "r" (r3) : "memory") /** @} */ +/** + * @brief VRQ return pseudo-instruction. + * + * @api + */ +#define __sb_vrq_return() __syscall0(255) + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ @@ -839,41 +846,53 @@ static inline void sbSleepMicroseconds(time_usecs_t usecs) { /** * @brief VRQ @p setwt pseudo-instruction. * + * @param[in] m VRQs mask + * * @api */ -static inline void __sb_vrq_setwt(void) { +static inline uint32_t __sb_vrq_setwt(uint32_t m) { - __syscall0(248); + __syscall1r(248, m); + return r0; } /** * @brief VRQ @p clrwt pseudo-instruction. * + * @param[in] m VRQs mask + * * @api */ -static inline void __sb_vrq_clrwt(void) { +static inline uint32_t __sb_vrq_clrwt(uint32_t m) { - __syscall0(249); + __syscall1r(249, m); + return r0; } /** * @brief VRQ @p seten pseudo-instruction. * + * @param[in] m VRQs mask + * * @api */ -static inline void __sb_vrq_seten(void) { +static inline uint32_t __sb_vrq_seten(uint32_t m) { - __syscall0(250); + __syscall1r(250, m); + return r0; } /** * @brief VRQ @p clren pseudo-instruction. * + * @param[in] m VRQs mask + * * @api */ -static inline void __sb_vrq_clren(void) { +static inline uint32_t __sb_vrq_clren(uint32_t m) { - __syscall0(251); + __syscall1r(251, m); + return r0; } /** @@ -907,16 +926,6 @@ static inline uint32_t __sb_vrq_getisr(void) { return r0; } -/** - * @brief VRQ return pseudo-instruction. - * - * @api - */ -static inline void __sb_vrq_return(void) { - - __syscall0(255); -} - #endif /* SBUSER_H */ /** @} */