From 5fa73624da19d3eb65c0934cca35c6d7df5acbd0 Mon Sep 17 00:00:00 2001 From: Alessio Morale Date: Thu, 6 Jun 2013 01:39:45 +0200 Subject: [PATCH] OP-980 Added memory barrier to preserve sequence to ensure callback validation +review OPReview-501 --- flight/pios/inc/pios_helpers.h | 1 + flight/pios/stm32f4xx/pios_usb_hid.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/flight/pios/inc/pios_helpers.h b/flight/pios/inc/pios_helpers.h index 6a3bc1810..fb8774b29 100644 --- a/flight/pios/inc/pios_helpers.h +++ b/flight/pios/inc/pios_helpers.h @@ -36,5 +36,6 @@ */ #define NELEMENTS(x) (sizeof(x) / sizeof((x)[0])) +#define WRITE_MEMORY_BARRIER() asm volatile("":::"memory") #endif // PIOS_HELPERS_H diff --git a/flight/pios/stm32f4xx/pios_usb_hid.c b/flight/pios/stm32f4xx/pios_usb_hid.c index 92fb8d898..b27c7faf2 100644 --- a/flight/pios/stm32f4xx/pios_usb_hid.c +++ b/flight/pios/stm32f4xx/pios_usb_hid.c @@ -68,10 +68,10 @@ struct pios_usb_hid_dev { bool usb_if_enabled; uint8_t rx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH] __attribute__((aligned(4))); - bool rx_active; + volatile bool rx_active; uint8_t tx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH] __attribute__((aligned(4))); - bool tx_active; + volatile bool tx_active; uint32_t rx_dropped; uint32_t rx_oversize; @@ -187,7 +187,7 @@ static bool PIOS_USB_HID_SendReport(struct pios_usb_hid_dev *usb_hid_dev) if (!usb_hid_dev->tx_out_cb) { return false; } - + WRITE_MEMORY_BARRIER(); bool need_yield = false; #ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE bytes_to_tx = (usb_hid_dev->tx_out_cb)(usb_hid_dev->tx_out_context, @@ -310,6 +310,7 @@ static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callbac * field to determine if it's ok to dereference _cb and _context */ usb_hid_dev->rx_in_context = context; + WRITE_MEMORY_BARRIER(); usb_hid_dev->rx_in_cb = rx_in_cb; } @@ -326,6 +327,7 @@ static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callbac * field to determine if it's ok to dereference _cb and _context */ usb_hid_dev->tx_out_context = context; + WRITE_MEMORY_BARRIER(); usb_hid_dev->tx_out_cb = tx_out_cb; } @@ -508,7 +510,7 @@ static bool PIOS_USB_HID_EP_OUT_Callback(uint32_t usb_hid_id, __attribute__((unu usb_hid_dev->rx_active = false; return false; } - + WRITE_MEMORY_BARRIER(); /* The first byte is report ID (not checked), the second byte is the valid data length */ uint16_t headroom; bool need_yield = false;