Dein syscall_exit_task() scheint eine Art yield() zu sein, d.h. beim nächsten Mal rennt der Task halt wieder weiter und direkt in sein Verderben, weil nach wie vor keine Rücksprungadresse auf dem Stack liegt.
Mach die while-Schleife weg und hinten einen Syscall dazu, der den Task wirklich beendet - ein syscall_destroy_task() oder so. Die Implementierung löscht den Task aus deiner Taskliste (oder was auch immer dein Scheduler benutzt), gibt allozierten Speicher frei und wechselt zum nächsten Task.