summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2022-05-30 14:01:57 -0400
committerWilliam D. Jones <[email protected]>2022-05-30 14:28:30 -0400
commit731ac3d3d60daf4831f2e9491a45d30cc2492d5b (patch)
treecf6e1afa8072c5d89707bb0e6f9bb0e538889f3c /src
parentf4efb51fe2b7f4fee38c28ff80d03904d0b5b73e (diff)
msp430x5xx: Add fix for possible bug in msp430-elf-gcc 9.3.0.
Diffstat (limited to 'src')
-rw-r--r--src/portable/ti/msp430x5xx/dcd_msp430x5xx.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
index c3b3b2403..f1d350dcc 100644
--- a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
+++ b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
@@ -623,7 +623,18 @@ void dcd_int_handler(uint8_t rhport)
handle_setup_packet();
}
- uint16_t curr_vector = USBVECINT;
+ // Workaround possible bug in MSP430 GCC 9.3.0 where volatile variable
+ // USBVECINT is read from twice when only once is intended. The second
+ // (garbage) read seems to be triggered by certain switch statement
+ // configurations.
+ uint16_t curr_vector;
+ #if __GNUC__ > 9 || (__GNUC__ == 9 && __GNUC_MINOR__ > 2)
+ asm volatile ("mov %1, %0"
+ : "=r" (curr_vector)
+ : "m" (USBVECINT));
+ #else
+ curr_vector = USBVECINT;
+ #endif
switch(curr_vector)
{