Du hast recht. Man könnte in foo() einmal den Prolog der "normalen" ISR (SREG und Register sichern) sowie den Epilog (SREG und register restaurieren) reinschreiben. Also als Makro den inline Assembler Code für Prolog und Epilog.

Für die Übergabeparameter müssen dann nochmal die entsprechenden Register in der ISR gesichert/restauriert werden.

Unterm Strich bleibt dann doch zumindest eine gehörige Portin inline Assembler übrig.