1. A method of providing secure code upgrades in a system comprising: storing original code in an on-chip memory; storing new code in an off-chip memory; storing a new function table in the off-chip memory; using the new function table to selectively execute code stored in the on-chip memory and the off-chip memory.