This looks ok, only that you can bust through the stack base if the stack is not big enough.

You could use R9 and R11 as StackBase and FramePointer respectively, and unwind the stack, though that's not a compulsory meaning for those registers and they can be used as general-purpose (and you'll end up unwinding garbage, or even segfaulting).

Both GCC and LLVM support frame pointers, but I believe it's disabled by default on LLVM+ARM. GCC can keep R9 fixed (via -ffixed-r9) for the stack base (via inline asm magic), but LLVM's support for this is less consistent (we mainly just ignore R9 through register allocation and let inline asm do its magic).

The most certain way of unwinding the stack is via Dwarf EH tables, but you don't want to do that!