diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-06-05 23:40:34 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-06-05 23:40:34 +0200 |
| commit | 70e1b976d87c5bde4b07e7e0b0fcf1499e4d98ef (patch) | |
| tree | 838b4e3f1c19eaa9a7828e9f582f37e90ed0f2d8 | |
| parent | adf053a935d03711b48859e3243e86d3038fa7c4 (diff) | |
rp/flash: fix missing clobbers, do not clobber frame pointer (r7).
| -rw-r--r-- | embassy-rp/src/flash.rs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/embassy-rp/src/flash.rs b/embassy-rp/src/flash.rs index 838b987dc..cd34e605e 100644 --- a/embassy-rp/src/flash.rs +++ b/embassy-rp/src/flash.rs | |||
| @@ -587,7 +587,6 @@ mod ram_helpers { | |||
| 587 | "ldr r4, [r5, #4]", | 587 | "ldr r4, [r5, #4]", |
| 588 | "blx r4", // flash_exit_xip() | 588 | "blx r4", // flash_exit_xip() |
| 589 | 589 | ||
| 590 | "mov r7, r10", // cmd | ||
| 591 | 590 | ||
| 592 | "movs r4, #0x18", | 591 | "movs r4, #0x18", |
| 593 | "lsls r4, r4, #24", // 0x18000000, SSI, RP2040 datasheet 4.10.13 | 592 | "lsls r4, r4, #24", // 0x18000000, SSI, RP2040 datasheet 4.10.13 |
| @@ -604,8 +603,9 @@ mod ram_helpers { | |||
| 604 | "str r1, [r4, #0]", | 603 | "str r1, [r4, #0]", |
| 605 | 604 | ||
| 606 | // Write ctrlr1 with len-1 | 605 | // Write ctrlr1 with len-1 |
| 607 | "ldr r0, [r7, #8]", // dummy_len | 606 | "mov r3, r10", // cmd |
| 608 | "ldr r1, [r7, #16]", // data_len | 607 | "ldr r0, [r3, #8]", // dummy_len |
| 608 | "ldr r1, [r3, #16]", // data_len | ||
| 609 | "add r0, r1", | 609 | "add r0, r1", |
| 610 | "subs r0, #1", | 610 | "subs r0, #1", |
| 611 | "str r0, [r4, #0x04]", // CTRLR1 | 611 | "str r0, [r4, #0x04]", // CTRLR1 |
| @@ -617,8 +617,8 @@ mod ram_helpers { | |||
| 617 | // Write cmd/addr phase to DR | 617 | // Write cmd/addr phase to DR |
| 618 | "mov r2, r4", | 618 | "mov r2, r4", |
| 619 | "adds r2, 0x60", // &DR | 619 | "adds r2, 0x60", // &DR |
| 620 | "ldr r0, [r7, #0]", // cmd_addr | 620 | "ldr r0, [r3, #0]", // cmd_addr |
| 621 | "ldr r1, [r7, #4]", // cmd_addr_len | 621 | "ldr r1, [r3, #4]", // cmd_addr_len |
| 622 | "10:", | 622 | "10:", |
| 623 | "ldrb r3, [r0]", | 623 | "ldrb r3, [r0]", |
| 624 | "strb r3, [r2]", // DR | 624 | "strb r3, [r2]", // DR |
| @@ -627,7 +627,8 @@ mod ram_helpers { | |||
| 627 | "bne 10b", | 627 | "bne 10b", |
| 628 | 628 | ||
| 629 | // Skip any dummy cycles | 629 | // Skip any dummy cycles |
| 630 | "ldr r1, [r7, #8]", // dummy_len | 630 | "mov r3, r10", // cmd |
| 631 | "ldr r1, [r3, #8]", // dummy_len | ||
| 631 | "cmp r1, #0", | 632 | "cmp r1, #0", |
| 632 | "beq 9f", | 633 | "beq 9f", |
| 633 | "4:", | 634 | "4:", |
| @@ -644,8 +645,9 @@ mod ram_helpers { | |||
| 644 | 645 | ||
| 645 | // Read RX fifo | 646 | // Read RX fifo |
| 646 | "9:", | 647 | "9:", |
| 647 | "ldr r0, [r7, #12]", // data | 648 | "mov r2, r10", // cmd |
| 648 | "ldr r1, [r7, #16]", // data_len | 649 | "ldr r0, [r2, #12]", // data |
| 650 | "ldr r1, [r2, #16]", // data_len | ||
| 649 | 651 | ||
| 650 | "2:", | 652 | "2:", |
| 651 | "ldr r3, [r4, #0x28]", // SR | 653 | "ldr r3, [r4, #0x28]", // SR |
| @@ -679,13 +681,12 @@ mod ram_helpers { | |||
| 679 | out("r2") _, | 681 | out("r2") _, |
| 680 | out("r3") _, | 682 | out("r3") _, |
| 681 | out("r4") _, | 683 | out("r4") _, |
| 684 | out("r5") _, | ||
| 682 | // Registers r8-r10 are used to store values | 685 | // Registers r8-r10 are used to store values |
| 683 | // from r0-r2 in registers not clobbered by | 686 | // from r0-r2 in registers not clobbered by |
| 684 | // function calls. | 687 | // function calls. |
| 685 | // The values can't be passed in using r8-r10 directly | 688 | // The values can't be passed in using r8-r10 directly |
| 686 | // due to https://github.com/rust-lang/rust/issues/99071 | 689 | // due to https://github.com/rust-lang/rust/issues/99071 |
| 687 | out("r8") _, | ||
| 688 | out("r9") _, | ||
| 689 | out("r10") _, | 690 | out("r10") _, |
| 690 | clobber_abi("C"), | 691 | clobber_abi("C"), |
| 691 | ); | 692 | ); |
