| [444] | 1 | #include "arm.h" |
|---|
| 2 | /* Run-time exception support */ |
|---|
| 3 | #ifndef PREFER_THUMB |
|---|
| 4 | #include "swi.h" |
|---|
| 5 | |
|---|
| 6 | /* .text is used instead of .section .text so it works with arm-aout too. */ |
|---|
| 7 | .text |
|---|
| 8 | .align 0 |
|---|
| 9 | .global __rt_stkovf_split_big |
|---|
| 10 | .global __rt_stkovf_split_small |
|---|
| 11 | |
|---|
| 12 | /* The following functions are provided for software stack checking. |
|---|
| 13 | If hardware stack-checking is being used then the code can be |
|---|
| 14 | compiled without the PCS entry checks, and simply rely on VM |
|---|
| 15 | management to extend the stack for a thread. |
|---|
| 16 | |
|---|
| 17 | The stack extension event occurs when the PCS function entry code |
|---|
| 18 | would result in a stack-pointer beneath the stack-limit register |
|---|
| 19 | value. The system relies on the following map: |
|---|
| 20 | |
|---|
| 21 | +-----------------------------------+ <-- end of stack block |
|---|
| 22 | | ... | |
|---|
| 23 | | ... | |
|---|
| 24 | | active stack | |
|---|
| 25 | | ... | <-- sp (stack-pointer) somewhere in here |
|---|
| 26 | | ... | |
|---|
| 27 | +-----------------------------------+ <-- sl (stack-limit) |
|---|
| 28 | | stack-extension handler workspace | |
|---|
| 29 | +-----------------------------------+ <-- base of stack block |
|---|
| 30 | |
|---|
| 31 | The "stack-extension handler workspace" is an amount of memory in |
|---|
| 32 | which the stack overflow support code must execute. It must be |
|---|
| 33 | large enough to deal with the worst case path through the extension |
|---|
| 34 | code. At the moment the compiler expects this to be AT LEAST |
|---|
| 35 | 256bytes. It uses this fact to code functions with small local |
|---|
| 36 | data usage within the overflow space. |
|---|
| 37 | |
|---|
| 38 | In a true target environment We may need to increase the space |
|---|
| 39 | between sl and the true limit to allow for the stack extension |
|---|
| 40 | code, SWI handlers and for undefined instruction handlers of the |
|---|
| 41 | target environment. */ |
|---|
| 42 | |
|---|
| 43 | __rt_stkovf_split_small: |
|---|
| 44 | mov ip,sp @ Ensure we can calculate the stack required |
|---|
| 45 | @ and fall through to... |
|---|
| 46 | __rt_stkovf_split_big: |
|---|
| 47 | @ in: sp = current stack-pointer (beneath stack-limit) |
|---|
| 48 | @ sl = current stack-limit |
|---|
| 49 | @ ip = low stack point we require for the current function |
|---|
| 50 | @ lr = return address into the current function |
|---|
| 51 | @ fp = frame-pointer |
|---|
| 52 | @ original sp --> +----------------------------------+ |
|---|
| 53 | @ | pc (12 ahead of PCS entry store) | |
|---|
| 54 | @ current fp ---> +----------------------------------+ |
|---|
| 55 | @ | lr (on entry) pc (on exit) | |
|---|
| 56 | @ +----------------------------------+ |
|---|
| 57 | @ | sp ("original sp" on entry) | |
|---|
| 58 | @ +----------------------------------+ |
|---|
| 59 | @ | fp (on entry to function) | |
|---|
| 60 | @ +----------------------------------+ |
|---|
| 61 | @ | | |
|---|
| 62 | @ | ..argument and work registers.. | |
|---|
| 63 | @ | | |
|---|
| 64 | @ current sp ---> +----------------------------------+ |
|---|
| 65 | @ |
|---|
| 66 | @ The "current sl" is somewhere between "original sp" and "current sp" |
|---|
| 67 | @ but above "true sl". The "current sl" should be at least 256bytes |
|---|
| 68 | @ above the "true sl". The 256byte stack guard should be large enough |
|---|
| 69 | @ to deal with the worst case function entry stacking (160bytes) plus |
|---|
| 70 | @ the stack overflow handler stacking requirements, plus the stack |
|---|
| 71 | @ required for the memory allocation routines. |
|---|
| 72 | @ |
|---|
| 73 | @ Normal PCS entry (before stack overflow check) can stack 16 |
|---|
| 74 | @ standard registers (64bytes) and 8 floating point registers |
|---|
| 75 | @ (96bytes). This gives a minimum stack guard of 160bytes (excluding |
|---|
| 76 | @ the stack required for the code). (Actually only a maximum of |
|---|
| 77 | @ 14standard registers are ever stacked on entry to a function). |
|---|
| 78 | @ |
|---|
| 79 | @ NOTE: Structure returns are performed by the caller allocating a |
|---|
| 80 | @ dummy space on the stack and passing in a "phantom" arg1 into |
|---|
| 81 | @ the function. This means that we do not need to worry about |
|---|
| 82 | @ preserving the stack under "sp" even on function return. |
|---|
| 83 | @ |
|---|
| 84 | @ Code should never poke values beneath sp. The sp register |
|---|
| 85 | @ should always be "dropped" first to cover the data. This |
|---|
| 86 | @ protects the data against any events that may try and use |
|---|
| 87 | @ the stack. |
|---|
| 88 | |
|---|
| 89 | SUB ip, sp, ip @ extra stack required for function |
|---|
| 90 | @ Add stack extension code here. If desired a new stack chunk |
|---|
| 91 | @ can be allocated, and the register state updated suitably. |
|---|
| 92 | |
|---|
| 93 | @ We now know how much extra stack the function requires. |
|---|
| 94 | @ Terminate the program for the moment: |
|---|
| 95 | swi SWI_Exit |
|---|
| 96 | #endif |
|---|