ARM: proc-arm94*.S: fix setup function
Both ARM946 and ARM940 setup functions were corrupting r1 and r2, which is not permissible - these are used to carry the machine ID and boot data into the kernel, and must be preserved. The code responsible for this was the same in both files: they were using the registers to generate a protection region register value. Fix this by turning this process into a macro, and using that macro in both these files with an alternative register allocation. r0, r3 and r7 can be used for temporary values here. Reported-by: Alex Dumitrache <broscutamaker@gmail.com> Tested-by: Georg Hofstetter <g3gg0.de@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
@@ -331,3 +331,27 @@ ENTRY(\name\()_tlb_fns)
|
||||
.globl \x
|
||||
.equ \x, \y
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Macro to calculate the log2 size for the protection region
|
||||
* registers. This calculates rd = log2(size) - 1. tmp must
|
||||
* not be the same register as rd.
|
||||
*/
|
||||
.macro pr_sz, rd, size, tmp
|
||||
mov \tmp, \size, lsr #12
|
||||
mov \rd, #11
|
||||
1: movs \tmp, \tmp, lsr #1
|
||||
addne \rd, \rd, #1
|
||||
bne 1b
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Macro to generate a protection region register value
|
||||
* given a pre-masked address, size, and enable bit.
|
||||
* Corrupts size.
|
||||
*/
|
||||
.macro pr_val, dest, addr, size, enable
|
||||
pr_sz \dest, \size, \size @ calculate log2(size) - 1
|
||||
orr \dest, \addr, \dest, lsl #1 @ mask in the region size
|
||||
orr \dest, \dest, \enable
|
||||
.endm
|
||||
|
Reference in New Issue
Block a user