Skip to content

Commit

Permalink
armv7-r/a: fix a4 register use in xxx_invalidate/flush/clean_all.S
Browse files Browse the repository at this point in the history
Use sub loop instead of add loop

Signed-off-by: zhuyanlin <[email protected]>
  • Loading branch information
zhuyanlinzyl committed Feb 7, 2022
1 parent 202b814 commit 13fdc7f
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 98 deletions.
38 changes: 18 additions & 20 deletions arch/arm/src/armv7-a/cp15_clean_dcache_all.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* arch/arm/src/armv7-a/cp15_flush_dcache_all.S
* arch/arm/src/armv7-a/cp15_clean_dcache_all.S
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <[email protected]>
Expand Down Expand Up @@ -54,7 +54,7 @@

#include "cp15.h"

.file "cp15_flush_dcache_all.S"
.file "cp15_clean_dcache_all.S"

/****************************************************************************
* Pre-processor Definitions
Expand All @@ -64,7 +64,7 @@
* Public Symbols
****************************************************************************/

.globl cp15_flush_dcache_all
.globl cp15_clean_dcache_all

/****************************************************************************
* Public Functions
Expand All @@ -73,7 +73,7 @@
.text

/****************************************************************************
* Name: cp15_flush_dcache_all
* Name: cp15_clean_dcache_all
*
* Description:
* Invalidate the entire contents of D cache.
Expand All @@ -86,36 +86,34 @@
*
****************************************************************************/

.globl cp15_flush_dcache_all
.type cp15_flush_dcache_all, function
.globl cp15_clean_dcache_all
.type cp15_clean_dcache_all, function

cp15_flush_dcache_all:
cp15_clean_dcache_all:

mrc CP15_CCSIDR(r1) /* Read the Cache Size Identification Register */

mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
and r0, r3, r0, lsr #13 /* r0=NumSets (number of sets - 1) */
and r0, r3, r1, lsr #13 /* r0=NumSets (number of sets - 1) */

ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
add r4, r3, r0, lsr #3 /* r4=(number of ways - 1) */
and r1, r3, r1, lsr #3 /* r1=(number of ways - 1) */

mov r1, #0 /* r1 = way loop counter */
way_loop:

mov r3, #0 /* r3 = set loop counter */
mov r3, r0 /* Init Sets */
set_loop:
mov r2, r1, lsl #30 /* r2 = way loop counter << 30 */
orr r2, r3, lsl #5 /* r2 = set/way cache operation format */
mcr CP15_DCCISW(r2) /* Data Cache Invalidate by Set/Way */
add r3, r3, #1 /* Increment set counter */
cmp r0, r3 /* Last set? */
mcr CP15_DCCSW(r2) /* Data Cache Clean by Set/Way */
sub r3, r3, #1 /* Subtraction set counter */
cmp r3, #0 /* Last set? */
bne set_loop /* Keep looping if not */

add r1, r1, #1 /* Increment the way counter */
cmp r4, r1 /* Last way */
sub r1, r1, #1 /* Subtraction the way counter */
cmp r1, #0 /* Last way? */
bne way_loop /* Keep looping if not */

dsb
bx lr
.size cp15_flush_dcache_all, . - cp15_flush_dcache_all
.size cp15_clean_dcache_all, . - cp15_clean_dcache_all
.end

38 changes: 18 additions & 20 deletions arch/arm/src/armv7-a/cp15_flush_dcache_all.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* arch/arm/src/armv7-a/cp15_clean_dcache_all.S
* arch/arm/src/armv7-a/cp15_flush_dcache_all.S
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <[email protected]>
Expand Down Expand Up @@ -54,7 +54,7 @@

#include "cp15.h"

.file "cp15_clean_dcache_all.S"
.file "cp15_flush_dcache_all.S"

/****************************************************************************
* Pre-processor Definitions
Expand All @@ -64,7 +64,7 @@
* Public Symbols
****************************************************************************/

.globl cp15_clean_dcache_all
.globl cp15_flush_dcache_all

/****************************************************************************
* Public Functions
Expand All @@ -73,7 +73,7 @@
.text

/****************************************************************************
* Name: cp15_clean_dcache_all
* Name: cp15_flush_dcache_all
*
* Description:
* Invalidate the entire contents of D cache.
Expand All @@ -86,36 +86,34 @@
*
****************************************************************************/

.globl cp15_clean_dcache_all
.type cp15_clean_dcache_all, function
.globl cp15_flush_dcache_all
.type cp15_flush_dcache_all, function

cp15_clean_dcache_all:
cp15_flush_dcache_all:

mrc CP15_CCSIDR(r1) /* Read the Cache Size Identification Register */

mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
and r0, r3, r0, lsr #13 /* r0=NumSets (number of sets - 1) */
and r0, r3, r1, lsr #13 /* r0=NumSets (number of sets - 1) */

ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
add r4, r3, r0, lsr #3 /* r4=(number of ways - 1) */
and r1, r3, r1, lsr #3 /* r1=(number of ways - 1) */

mov r1, #0 /* r1 = way loop counter */
way_loop:

mov r3, #0 /* r3 = set loop counter */
mov r3, r0 /* Init Sets */
set_loop:
mov r2, r1, lsl #30 /* r2 = way loop counter << 30 */
orr r2, r3, lsl #5 /* r2 = set/way cache operation format */
mcr CP15_DCCSW(r2) /* Data Cache Invalidate by Set/Way */
add r3, r3, #1 /* Increment set counter */
cmp r0, r3 /* Last set? */
mcr CP15_DCCISW(r2) /* Data Cache Clean and Invalidate by Set/Way */
sub r3, r3, #1 /* Subtraction set counter */
cmp r3, #0 /* Last set? */
bne set_loop /* Keep looping if not */

add r1, r1, #1 /* Increment the way counter */
cmp r4, r1 /* Last way */
sub r1, r1, #1 /* Subtraction the way counter */
cmp r1, #0 /* Last way? */
bne way_loop /* Keep looping if not */

dsb
bx lr
.size cp15_clean_dcache_all, . - cp15_clean_dcache_all
.size cp15_flush_dcache_all, . - cp15_flush_dcache_all
.end

19 changes: 9 additions & 10 deletions arch/arm/src/armv7-a/cp15_invalidate_dcache_all.S
Original file line number Diff line number Diff line change
Expand Up @@ -91,27 +91,26 @@

cp15_invalidate_dcache_all:

mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
mrc CP15_CCSIDR(r1) /* Read the Cache Size Identification Register */

ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
and r0, r3, r0, lsr #13 /* r0=NumSets (number of sets - 1) */
and r0, r3, r1, lsr #13 /* r0=NumSets (number of sets - 1) */

ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
add r4, r3, r0, lsr #3 /* r4=(number of ways - 1) */
and r1, r3, r1, lsr #3 /* r1=(number of ways - 1) */

mov r1, #0 /* r1 = way loop counter */
way_loop:

mov r3, #0 /* r3 = set loop counter */
mov r3, r0 /* Init Sets */
set_loop:
mov r2, r1, lsl #30 /* r2 = way loop counter << 30 */
orr r2, r3, lsl #5 /* r2 = set/way cache operation format */
mcr CP15_DCISW(r2) /* Data Cache Invalidate by Set/Way */
add r3, r3, #1 /* Increment set counter */
cmp r0, r3 /* Last set? */
sub r3, r3, #1 /* Subtraction set counter */
cmp r3, #0 /* Last set? */
bne set_loop /* Keep looping if not */

add r1, r1, #1 /* Increment the way counter */
cmp r4, r1 /* Last way? */
sub r1, r1, #1 /* Subtraction the way counter */
cmp r1, #0 /* Last way? */
bne way_loop /* Keep looping if not */

dsb
Expand Down
37 changes: 18 additions & 19 deletions arch/arm/src/armv7-r/cp15_clean_dcache_all.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* arch/arm/src/armv7-r/cp15_flush_dcache_all.S
* arch/arm/src/armv7-r/cp15_clean_dcache_all.S
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <[email protected]>
Expand Down Expand Up @@ -54,7 +54,7 @@

#include "cp15.h"

.file "cp15_flush_dcache_all.S"
.file "cp15_clean_dcache_all.S"

/****************************************************************************
* Pre-processor Definitions
Expand All @@ -64,7 +64,7 @@
* Public Symbols
****************************************************************************/

.globl cp15_flush_dcache_all
.globl cp15_clean_dcache_all

/****************************************************************************
* Public Functions
Expand All @@ -73,7 +73,7 @@
.text

/****************************************************************************
* Name: cp15_flush_dcache_all
* Name: cp15_clean_dcache_all
*
* Description:
* Invalidate the entire contents of D cache.
Expand All @@ -86,36 +86,35 @@
*
****************************************************************************/

.globl cp15_flush_dcache_all
.type cp15_flush_dcache_all, function
.globl cp15_clean_dcache_all
.type cp15_clean_dcache_all, function

cp15_flush_dcache_all:
cp15_clean_dcache_all:

mrc CP15_CCSIDR(r1) /* Read the Cache Size Identification Register */

mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
and r0, r3, r0, lsr #13 /* r0=NumSets (number of sets - 1) */
and r0, r3, r1, lsr #13 /* r0=NumSets (number of sets - 1) */

ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
add r4, r3, r0, lsr #3 /* r4=(number of ways - 1) */
and r1, r3, r1, lsr #3 /* r1=(number of ways - 1) */

mov r1, #0 /* r1 = way loop counter */
way_loop:

mov r3, #0 /* r3 = set loop counter */
mov r3, r0 /* Init Sets */
set_loop:
mov r2, r1, lsl #30 /* r2 = way loop counter << 30 */
orr r2, r3, lsl #5 /* r2 = set/way cache operation format */
mcr CP15_DCCISW(r2) /* Data Cache Invalidate by Set/Way */
add r3, r3, #1 /* Increment set counter */
cmp r0, r3 /* Last set? */
mcr CP15_DCCSW(r2) /* Data Cache Clean by Set/Way */
sub r3, r3, #1 /* Subtraction set counter */
cmp r3, #0 /* Last set? */
bne set_loop /* Keep looping if not */

add r1, r1, #1 /* Increment the way counter */
cmp r4, r1 /* Last way */
sub r1, r1, #1 /* Subtraction the way counter */
cmp r1, #0 /* Last way? */
bne way_loop /* Keep looping if not */

dsb
bx lr
.size cp15_flush_dcache_all, . - cp15_flush_dcache_all
.size cp15_clean_dcache_all, . - cp15_clean_dcache_all
.end

37 changes: 18 additions & 19 deletions arch/arm/src/armv7-r/cp15_flush_dcache_all.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* arch/arm/src/armv7-r/cp15_clean_dcache_all.S
* arch/arm/src/armv7-r/cp15_flush_dcache_all.S
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <[email protected]>
Expand Down Expand Up @@ -54,7 +54,7 @@

#include "cp15.h"

.file "cp15_clean_dcache_all.S"
.file "cp15_flush_dcache_all.S"

/****************************************************************************
* Pre-processor Definitions
Expand All @@ -64,7 +64,7 @@
* Public Symbols
****************************************************************************/

.globl cp15_clean_dcache_all
.globl cp15_flush_dcache_all

/****************************************************************************
* Public Functions
Expand All @@ -73,7 +73,7 @@
.text

/****************************************************************************
* Name: cp15_clean_dcache_all
* Name: cp15_flush_dcache_all
*
* Description:
* Invalidate the entire contents of D cache.
Expand All @@ -86,36 +86,35 @@
*
****************************************************************************/

.globl cp15_clean_dcache_all
.type cp15_clean_dcache_all, function
.globl cp15_flush_dcache_all
.type cp15_flush_dcache_all, function

cp15_clean_dcache_all:
cp15_flush_dcache_all:

mrc CP15_CCSIDR(r1) /* Read the Cache Size Identification Register */

mrc CP15_CCSIDR(r0) /* Read the Cache Size Identification Register */
ldr r3, =0x7fff /* Isolate the NumSets field (bits 13-27) */
and r0, r3, r0, lsr #13 /* r0=NumSets (number of sets - 1) */
and r0, r3, r1, lsr #13 /* r0=NumSets (number of sets - 1) */

ldr r3, =0x3ff /* Isolate the way field (bits 3-12) */
add r4, r3, r0, lsr #3 /* r4=(number of ways - 1) */
and r1, r3, r1, lsr #3 /* r1=(number of ways - 1) */

mov r1, #0 /* r1 = way loop counter */
way_loop:

mov r3, #0 /* r3 = set loop counter */
mov r3, r0 /* Init Sets */
set_loop:
mov r2, r1, lsl #30 /* r2 = way loop counter << 30 */
orr r2, r3, lsl #5 /* r2 = set/way cache operation format */
mcr CP15_DCCSW(r2) /* Data Cache Invalidate by Set/Way */
add r3, r3, #1 /* Increment set counter */
cmp r0, r3 /* Last set? */
mcr CP15_DCCISW(r2) /* Data Cache Clean and Invalidate by Set/Way */
sub r3, r3, #1 /* Subtraction set counter */
cmp r3, #0 /* Last set? */
bne set_loop /* Keep looping if not */

add r1, r1, #1 /* Increment the way counter */
cmp r4, r1 /* Last way */
sub r1, r1, #1 /* Subtraction the way counter */
cmp r1, #0 /* Last way? */
bne way_loop /* Keep looping if not */

dsb
bx lr
.size cp15_clean_dcache_all, . - cp15_clean_dcache_all
.size cp15_flush_dcache_all, . - cp15_flush_dcache_all
.end

Loading

0 comments on commit 13fdc7f

Please sign in to comment.