forked from luck/tmp_suning_uos_patched
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>
This commit is contained in:
parent
1f80a67da2
commit
0eb6aaf529
|
@ -62,15 +62,14 @@ real_start:
|
||||||
andi r1, r1, ~2
|
andi r1, r1, ~2
|
||||||
mts rmsr, r1
|
mts rmsr, r1
|
||||||
/*
|
/*
|
||||||
* Here is checking mechanism which check if Microblaze has msr instructions
|
* According to Xilinx, msrclr instruction behaves like 'mfs rX,rpc'
|
||||||
* We load msr and compare it with previous r1 value - if is the same,
|
* if the msrclr instruction is not enabled. We use this to detect
|
||||||
* msr instructions works if not - cpu don't have them.
|
* 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 */
|
msrclr r8, 0 /* clear nothing - just read msr for test */
|
||||||
rsubi r0, r0, 1 /* set the carry bit */
|
cmpu r8, r8, r1 /* r1 must contain msr reg content */
|
||||||
msrclr r0, 0x4 /* try to clear it */
|
|
||||||
/* read the carry bit, r8 will be '0' if msrclr exists */
|
|
||||||
addik r8, r0, 0
|
|
||||||
|
|
||||||
/* r7 may point to an FDT, or there may be one linked in.
|
/* 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.
|
if it's in r7, we've got to save it away ASAP.
|
||||||
|
|
|
@ -161,11 +161,11 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
|
||||||
#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
|
#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
|
||||||
if (msr)
|
if (msr)
|
||||||
eprintk("!!!Your kernel has setup MSR instruction but "
|
eprintk("!!!Your kernel has setup MSR instruction but "
|
||||||
"CPU don't have it %d\n", msr);
|
"CPU don't have it %x\n", msr);
|
||||||
#else
|
#else
|
||||||
if (!msr)
|
if (!msr)
|
||||||
eprintk("!!!Your kernel not setup MSR instruction but "
|
eprintk("!!!Your kernel not setup MSR instruction but "
|
||||||
"CPU have it %d\n", msr);
|
"CPU have it %x\n", msr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (src = __ivt_start; src < __ivt_end; src++, dst++)
|
for (src = __ivt_start; src < __ivt_end; src++, dst++)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user