Hi, thanks for the answer. Unfortunately the problem is somewhere else. Currently I've found that:
After first USB interrupt, interrupt vector table is corrupted (?) and next interrupt (?) go to undef_int() function, and naturally board is reset by watchdog. The most interesting is that it happens only if compiled with start address 0x1000, with start 0x0 (no bootloader) everything works fine.
I realize that this problem is really strange, I write here to share information - maybe someone sometime find it useful. When I find solution, I'll write here.
BTW, is there any way in ISR (undef_int()) get interrupt vector that caused this interrupt?
UPD1: I've checked that this is not spurious interrupt.
UPD2: It's "Illegal instruction" exception.
UPD3: It seems I was "lucky" and "enjoyed" Speculation Address errata. After I changed code in Starup_gnu.s to unconditional
move.l #0x61,%d0 /* This is the workaround 1 due to the Internal FLASH Speculation error in the first devices */
movec %d0,#0x0c04
everything works. It's possible that original code
move.l #__FLASH,%d0
add.l #0x61,%d0
movec %d0,#0x0c04
may not work as expected if __FLASH is not 0x0 (in case of bootloader)