flush tlb hang if io not mapped

with kernel 2.6.35, on beagle xm rev C, I found a situation that hangs the kernel here:

if I do nothing in map_io, which be called just before local_flush_tlb_all, kernel will hang up there.

setup_arch->paging_init->devicemaps_init last two lines

`
static inline void local_flush_tlb_all(void)
{
const int zero = 0;
const unsigned int __tlb_flag = __cpu_tlb_flags;

if (tlb_flag(TLB_WB))
dsb();

if (tlb_flag(TLB_V3_FULL))
asm(“mcr p15, 0, %0, c6, c0, 0” : : “r” (zero) : “cc”);
if (tlb_flag(TLB_V4_U_FULL | TLB_V6_U_FULL))
asm(“mcr p15, 0, %0, c8, c7, 0” : : “r” (zero) : “cc”); // kernel hangs at this line
if (tlb_flag(TLB_V4_D_FULL | TLB_V6_D_FULL))
asm(“mcr p15, 0, %0, c8, c6, 0” : : “r” (zero) : “cc”);
if (tlb_flag(TLB_V4_I_FULL | TLB_V6_I_FULL))
asm(“mcr p15, 0, %0, c8, c5, 0” : : “r” (zero) : “cc”);
if (tlb_flag(TLB_V7_UIS_FULL))
asm(“mcr p15, 0, %0, c8, c3, 0” : : “r” (zero) : “cc”);

if (tlb_flag(TLB_BTB)) {
/* flush the branch target cache /
asm(“mcr p15, 0, %0, c7, c5, 6” : : “r” (zero) : “cc”);
dsb();
isb();
}
if (tlb_flag(TLB_V7_IS_BTB)) {
/
flush the branch target cache */
asm(“mcr p15, 0, %0, c7, c1, 6” : : “r” (zero) : “cc”);
dsb();
isb();
}
}
`

but if I mapped CPU L4 peripheral to some virtual address in map_io, thislocal_flush_tlb_all call will run correctly.
I have enabled early printk in kernel which I use it to locate where kernel stopped.

so my question is what effect will mapping L4 peripheral do to local_flush_tlb_all?

thanks