I have found interesting thing. _oops event that I'm facing when running from external flash is caused by stack sentinel checking so in fact I'm getting a stack corruption - shell thread is overwriting stack of main_thread.
This situation never happens when running from internal flash.
Strange... Where is the context switching done? I need to check, what is setting SP to wrong value.