You can mark some functions with the __attribute__((section("foo")), these will get linked into a separate text area - so you could arrange to copy those critical functions into onchip memory.
You might need to stand back a little and consider exactly what you need where, and then adjust the build sequence to 'make it so'. You'll probbaly need to use your own linker script!
Internal M9K (etc) memory blocks can be initialised as part of the fpga image. So you can write your own boot code that loads from EPROM in any way you like. The EPCS loader is just some code like that written by Altera.