aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze/kernel/head.S
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2011-02-04 15:24:11 +0100
committerMichal Simek <monstr@monstr.eu>2011-02-07 19:13:01 +0100
commit0eb6aaf52965c14ba3ea245448c4806cfcd1d18c (patch)
tree046fba87d27c0461cd3ba897e5a0fd3b5362c3df /arch/microblaze/kernel/head.S
parent1f80a67da2da4180355bc36b2691f16684b194fd (diff)
downloadkernel_samsung_smdk4412-0eb6aaf52965c14ba3ea245448c4806cfcd1d18c.tar.gz
kernel_samsung_smdk4412-0eb6aaf52965c14ba3ea245448c4806cfcd1d18c.tar.bz2
kernel_samsung_smdk4412-0eb6aaf52965c14ba3ea245448c4806cfcd1d18c.zip
microblaze: Fix msr instruction detection
Fix msr instructions detection. The current code just use msrclr for loading msr content and compare it with proper MSR content. If msrclr is not implemented r8 contains pc address. Previous code wanted to use MSR carry bit but if msrclr wasn't implemented carry wasn't cleared. Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/kernel/head.S')
-rw-r--r--arch/microblaze/kernel/head.S15
1 files changed, 7 insertions, 8 deletions
diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S
index 0db20b5abb5..778a5ce2e4f 100644
--- a/arch/microblaze/kernel/head.S
+++ b/arch/microblaze/kernel/head.S
@@ -62,15 +62,14 @@ real_start:
andi r1, r1, ~2
mts rmsr, r1
/*
- * Here is checking mechanism which check if Microblaze has msr instructions
- * We load msr and compare it with previous r1 value - if is the same,
- * msr instructions works if not - cpu don't have them.
+ * According to Xilinx, msrclr instruction behaves like 'mfs rX,rpc'
+ * if the msrclr instruction is not enabled. We use this to detect
+ * if the opcode is available, by issuing msrclr and then testing the result.
+ * r8 == 0 - msr instructions are implemented
+ * r8 != 0 - msr instructions are not implemented
*/
- /* r8=0 - I have msr instr, 1 - I don't have them */
- rsubi r0, r0, 1 /* set the carry bit */
- msrclr r0, 0x4 /* try to clear it */
- /* read the carry bit, r8 will be '0' if msrclr exists */
- addik r8, r0, 0
+ msrclr r8, 0 /* clear nothing - just read msr for test */
+ cmpu r8, r8, r1 /* r1 must contain msr reg content */
/* r7 may point to an FDT, or there may be one linked in.
if it's in r7, we've got to save it away ASAP.