1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-17 04:52:59 +01:00
RIOT/cpu
bors[bot] 06e27d5aba
Merge #19619
19619: cpu/arm7: Fix undefined behavior based on invalid assembly r=aabadie a=Teufelchen1

### Contribution description

Hellooo! 🦤

In this PR a single `NOP` is added after an `ldm` in ARM7 common code in the scheduling management.
The change is necessary because this particular `ldm` affects certain banked registers, including `R14 / lr`. The next instruction then immediately accesses `lr`. This is invalid and the exact effect depends on the underlying hardware implementation. An intermediate `NOP` ensures correct behaviour in such cases.

The ARM docs can be found [here](https://documentation-service.arm.com/static/5f8dacc8f86e16515cdb865a), in section `A4.1.21 LDM (2)`. It states:
> In ARM architecture versions earlier than ARMv6, this form of LDM must not be
followed by an instruction that accesses banked registers. A following NOP is a good
way to ensure this.


### Testing procedure

Without this change, on the Game Boy Advance, RIOT behaves irregularly. With the `NOP`, it works fine!
If possible, this change should be tested on other ARM7 hardware as well but I do not have access to any.  

----

Special thanks `@pyropeter` for spotting the extremely tiny note on this issue within the ARM docs. You saved me hours of tears! 👾

Co-authored-by: Teufelchen1 <bennet.blischke@outlook.com>
2023-05-20 12:51:14 +00:00
..
arm7_common cpu/arm7: Fix undefined behavior based on invalid assembly 2023-05-19 11:34:30 +02:00
atmega32u4 cpu/atmega_common: implement periph/gpio_ll{,_irq} 2022-05-02 14:44:55 +02:00
atmega128rfa1 cpu/atmega128rfa1/Kconfig: select default transceiver 2023-01-19 15:34:19 +01:00
atmega256rfr2 cpu/atmega256rfr2/Kconfig: select default transceiver 2023-01-19 15:34:19 +01:00
atmega328p cpu/atmega_common: implement periph/gpio_ll{,_irq} 2022-05-02 14:44:55 +02:00
atmega1281 cpu/atmega_common: implement periph/gpio_ll{,_irq} 2022-05-02 14:44:55 +02:00
atmega1284p cpu/atmega_common: implement periph/gpio_ll{,_irq} 2022-05-02 14:44:55 +02:00
atmega2560 cpu/atmega_common: implement periph/gpio_ll{,_irq} 2022-05-02 14:44:55 +02:00
atmega_common drivers/at86rf2xx: rx timestamp generation for ATmegaRFR2 2023-05-19 15:33:15 +02:00
atxmega Merge pull request #18619 from maribu/core/mutex/cleanup 2022-10-03 10:58:07 +02:00
avr8_common cpu/avr8_common: implement perror() 2023-04-26 10:31:09 +02:00
cc26x0_cc13x0 cpu/cc26x0_cc13x0: Drop feature cortexm_mpu 2023-04-26 10:51:52 +02:00
cc26x2_cc13x2 cpu: call early_init() 2023-01-08 22:26:12 +01:00
cc26xx_cc13xx cpu/cc26xx_cc13xx: Fix bogus array-bound warning 2023-04-25 15:31:27 +02:00
cc2538 cpu: call early_init() 2023-01-08 22:26:12 +01:00
cortexm_common cpu/cortexm_common: remove CMSIS vendor code 2023-05-14 21:08:28 +02:00
efm32 cpu/efm32: fix dependency to cmsis-dsp module 2023-05-14 21:18:50 +02:00
esp32 treewide: fix path to shell related tests in doc 2023-05-13 18:27:58 +02:00
esp8266 treewide: fix path to shell related tests in doc 2023-05-13 18:27:58 +02:00
esp_common cpu/esp_common: fix compilation issues gcc 12.2 2023-04-05 13:46:26 +02:00
fe310 cpu/riscv_common: rename cpu.h to cpu_common.h 2023-04-18 06:20:14 +02:00
gd32v tree wide: fix typos in comments found by codespell 2023-05-02 09:52:06 +02:00
kinetis cpu: call early_init() 2023-01-08 22:26:12 +01:00
lm4f120 cpu: call early_init() 2023-01-08 22:26:12 +01:00
lpc23xx cpu: Add TLS symbols for newer picolibc to linker scripts 2023-03-02 22:55:22 -08:00
lpc1768 cpu: call early_init() 2023-01-08 22:26:12 +01:00
msp430_common cpu/msp430fxyz: clean up clock initialization 2023-05-16 10:05:09 +02:00
msp430fxyz cpu/msp430fxyz: clean up clock initialization 2023-05-16 10:05:09 +02:00
native Merge #19368 #19529 #19531 2023-05-02 18:08:42 +00:00
nrf5x_common cpu/nrf5x_common: Implement timer_set() 2022-12-23 14:48:08 +01:00
nrf51 cpu: call early_init() 2023-01-08 22:26:12 +01:00
nrf52 tree wide: fix typos in comments found by codespell 2023-05-02 09:52:06 +02:00
nrf9160 tree wide: fix typos in comments found by codespell 2023-05-02 09:52:06 +02:00
qn908x cpu: call early_init() 2023-01-08 22:26:12 +01:00
riscv_common cpu/riscv_common: add riotboot linker support 2023-04-18 06:20:14 +02:00
rpx0xx treewide: replace occurrences of tests/periph_ with new path 2023-05-06 15:33:03 +02:00
sam0_common cpu/stm32: cpu/sam0_common: rename internal i2c _start function 2023-05-14 21:08:26 +02:00
sam3 cpu: call early_init() 2023-01-08 22:26:12 +01:00
sam_common cpu/sam_common: make use of cortexm.ld 2022-09-23 15:55:12 +02:00
samd5x cpu/sam0_common: move adc_res_t to common code 2023-01-17 17:18:07 +01:00
samd21 cpu/sam0_common: move adc_res_t to common code 2023-01-17 17:18:07 +01:00
saml1x cpu/sam0_common: move adc_res_t to common code 2023-01-17 17:18:07 +01:00
saml21 treewide: fix path to ztimer test applications 2023-05-13 19:08:38 +02:00
stellaris_common cpu: do not locally export compilation variables 2019-08-29 10:35:53 +02:00
stm32 Merge #19572 2023-05-20 09:57:27 +00:00
doc.txt docs/doxygen : Add CPU section 2021-07-09 10:47:42 +02:00
Kconfig treewide: change Kconfig prefix for module symbols 2020-08-31 09:57:28 +02:00