microblaze: Fix compilation error for BS=0
This bug was introduced by:
"microblaze: Do not used hardcoded value in exception handler"
(sha1: 9f78d3b5ab
)
System without barrel shifter are pretty rare that's why
this bug has been fixed so late.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
34b9c07a3b
commit
52ade599e3
|
@ -147,15 +147,14 @@
|
||||||
or r3, r0, NUM_TO_REG (regnum);
|
or r3, r0, NUM_TO_REG (regnum);
|
||||||
|
|
||||||
/* Shift right instruction depending on available configuration */
|
/* Shift right instruction depending on available configuration */
|
||||||
#if CONFIG_XILINX_MICROBLAZE0_USE_BARREL > 0
|
#if CONFIG_XILINX_MICROBLAZE0_USE_BARREL == 0
|
||||||
#define BSRLI(rD, rA, imm) \
|
|
||||||
bsrli rD, rA, imm
|
|
||||||
#else
|
|
||||||
#define BSRLI(rD, rA, imm) BSRLI ## imm (rD, rA)
|
|
||||||
/* Only the used shift constants defined here - add more if needed */
|
/* Only the used shift constants defined here - add more if needed */
|
||||||
#define BSRLI2(rD, rA) \
|
#define BSRLI2(rD, rA) \
|
||||||
srl rD, rA; /* << 1 */ \
|
srl rD, rA; /* << 1 */ \
|
||||||
srl rD, rD; /* << 2 */
|
srl rD, rD; /* << 2 */
|
||||||
|
#define BSRLI4(rD, rA) \
|
||||||
|
BSRLI2(rD, rA); \
|
||||||
|
BSRLI2(rD, rD)
|
||||||
#define BSRLI10(rD, rA) \
|
#define BSRLI10(rD, rA) \
|
||||||
srl rD, rA; /* << 1 */ \
|
srl rD, rA; /* << 1 */ \
|
||||||
srl rD, rD; /* << 2 */ \
|
srl rD, rD; /* << 2 */ \
|
||||||
|
@ -170,7 +169,33 @@
|
||||||
#define BSRLI20(rD, rA) \
|
#define BSRLI20(rD, rA) \
|
||||||
BSRLI10(rD, rA); \
|
BSRLI10(rD, rA); \
|
||||||
BSRLI10(rD, rD)
|
BSRLI10(rD, rD)
|
||||||
|
|
||||||
|
.macro bsrli, rD, rA, IMM
|
||||||
|
.if (\IMM) == 2
|
||||||
|
BSRLI2(\rD, \rA)
|
||||||
|
.elseif (\IMM) == 10
|
||||||
|
BSRLI10(\rD, \rA)
|
||||||
|
.elseif (\IMM) == 12
|
||||||
|
BSRLI2(\rD, \rA)
|
||||||
|
BSRLI10(\rD, \rD)
|
||||||
|
.elseif (\IMM) == 14
|
||||||
|
BSRLI4(\rD, \rA)
|
||||||
|
BSRLI10(\rD, \rD)
|
||||||
|
.elseif (\IMM) == 20
|
||||||
|
BSRLI20(\rD, \rA)
|
||||||
|
.elseif (\IMM) == 24
|
||||||
|
BSRLI4(\rD, \rA)
|
||||||
|
BSRLI20(\rD, \rD)
|
||||||
|
.elseif (\IMM) == 28
|
||||||
|
BSRLI4(\rD, \rA)
|
||||||
|
BSRLI4(\rD, \rD)
|
||||||
|
BSRLI20(\rD, \rD)
|
||||||
|
.else
|
||||||
|
.error "BSRLI shift macros \IMM"
|
||||||
|
.endif
|
||||||
|
.endm
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
.extern other_exception_handler /* Defined in exception.c */
|
.extern other_exception_handler /* Defined in exception.c */
|
||||||
|
@ -604,7 +629,7 @@ ex_handler_done:
|
||||||
ex4:
|
ex4:
|
||||||
tophys(r4,r4)
|
tophys(r4,r4)
|
||||||
/* Create L1 (pgdir/pmd) address */
|
/* Create L1 (pgdir/pmd) address */
|
||||||
BSRLI(r5,r3, PGDIR_SHIFT - 2)
|
bsrli r5, r3, PGDIR_SHIFT - 2
|
||||||
andi r5, r5, PAGE_SIZE - 4
|
andi r5, r5, PAGE_SIZE - 4
|
||||||
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
||||||
or r4, r4, r5
|
or r4, r4, r5
|
||||||
|
@ -613,7 +638,7 @@ ex_handler_done:
|
||||||
beqi r5, ex2 /* Bail if no table */
|
beqi r5, ex2 /* Bail if no table */
|
||||||
|
|
||||||
tophys(r5,r5)
|
tophys(r5,r5)
|
||||||
BSRLI(r6,r3,PTE_SHIFT) /* Compute PTE address */
|
bsrli r6, r3, PTE_SHIFT /* Compute PTE address */
|
||||||
andi r6, r6, PAGE_SIZE - 4
|
andi r6, r6, PAGE_SIZE - 4
|
||||||
or r5, r5, r6
|
or r5, r5, r6
|
||||||
lwi r4, r5, 0 /* Get Linux PTE */
|
lwi r4, r5, 0 /* Get Linux PTE */
|
||||||
|
@ -705,7 +730,7 @@ ex_handler_done:
|
||||||
ex6:
|
ex6:
|
||||||
tophys(r4,r4)
|
tophys(r4,r4)
|
||||||
/* Create L1 (pgdir/pmd) address */
|
/* Create L1 (pgdir/pmd) address */
|
||||||
BSRLI(r5,r3, PGDIR_SHIFT - 2)
|
bsrli r5, r3, PGDIR_SHIFT - 2
|
||||||
andi r5, r5, PAGE_SIZE - 4
|
andi r5, r5, PAGE_SIZE - 4
|
||||||
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
||||||
or r4, r4, r5
|
or r4, r4, r5
|
||||||
|
@ -714,7 +739,7 @@ ex_handler_done:
|
||||||
beqi r5, ex7 /* Bail if no table */
|
beqi r5, ex7 /* Bail if no table */
|
||||||
|
|
||||||
tophys(r5,r5)
|
tophys(r5,r5)
|
||||||
BSRLI(r6,r3,PTE_SHIFT) /* Compute PTE address */
|
bsrli r6, r3, PTE_SHIFT /* Compute PTE address */
|
||||||
andi r6, r6, PAGE_SIZE - 4
|
andi r6, r6, PAGE_SIZE - 4
|
||||||
or r5, r5, r6
|
or r5, r5, r6
|
||||||
lwi r4, r5, 0 /* Get Linux PTE */
|
lwi r4, r5, 0 /* Get Linux PTE */
|
||||||
|
@ -776,7 +801,7 @@ ex_handler_done:
|
||||||
ex9:
|
ex9:
|
||||||
tophys(r4,r4)
|
tophys(r4,r4)
|
||||||
/* Create L1 (pgdir/pmd) address */
|
/* Create L1 (pgdir/pmd) address */
|
||||||
BSRLI(r5,r3, PGDIR_SHIFT - 2)
|
bsrli r5, r3, PGDIR_SHIFT - 2
|
||||||
andi r5, r5, PAGE_SIZE - 4
|
andi r5, r5, PAGE_SIZE - 4
|
||||||
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
/* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */
|
||||||
or r4, r4, r5
|
or r4, r4, r5
|
||||||
|
@ -785,7 +810,7 @@ ex_handler_done:
|
||||||
beqi r5, ex10 /* Bail if no table */
|
beqi r5, ex10 /* Bail if no table */
|
||||||
|
|
||||||
tophys(r5,r5)
|
tophys(r5,r5)
|
||||||
BSRLI(r6,r3,PTE_SHIFT) /* Compute PTE address */
|
bsrli r6, r3, PTE_SHIFT /* Compute PTE address */
|
||||||
andi r6, r6, PAGE_SIZE - 4
|
andi r6, r6, PAGE_SIZE - 4
|
||||||
or r5, r5, r6
|
or r5, r5, r6
|
||||||
lwi r4, r5, 0 /* Get Linux PTE */
|
lwi r4, r5, 0 /* Get Linux PTE */
|
||||||
|
@ -922,7 +947,7 @@ ex_handler_done:
|
||||||
.ent _unaligned_data_exception
|
.ent _unaligned_data_exception
|
||||||
_unaligned_data_exception:
|
_unaligned_data_exception:
|
||||||
andi r8, r3, 0x3E0; /* Mask and extract the register operand */
|
andi r8, r3, 0x3E0; /* Mask and extract the register operand */
|
||||||
BSRLI(r8,r8,2); /* r8 >> 2 = register operand * 8 */
|
bsrli r8, r8, 2; /* r8 >> 2 = register operand * 8 */
|
||||||
andi r6, r3, 0x400; /* Extract ESR[S] */
|
andi r6, r3, 0x400; /* Extract ESR[S] */
|
||||||
bneid r6, ex_sw_vm;
|
bneid r6, ex_sw_vm;
|
||||||
andi r6, r3, 0x800; /* Extract ESR[W] - delay slot */
|
andi r6, r3, 0x800; /* Extract ESR[W] - delay slot */
|
||||||
|
|
Loading…
Reference in New Issue