What is our usage of CFP, OCFP and CSP?
It is an invariant that CSP always points after any useful information so that at any time an interrupt can come and allocate stuff in the stack.
TR call is also a constraint: we can’t deallocate the caller’s frame before the call, since it holds the stack arguments for the call.
What we do is have the caller set up CFP, and have the callee set CSP to CFP plus the frame size. The caller leaves CSP alone: the callee is the one who does any necessary stack deallocation.
In a TR call, we don’t do anything: CFP is left as CFP, and CSP points to the end of the frame, keeping the stack arguments from being trashed.
In a normal call, CFP is set to CSP, causing the callee’s frame to be allocated after the current frame.