diff options
Diffstat (limited to 'libc/sysdeps/linux/xtensa/__longjmp.S')
| -rw-r--r-- | libc/sysdeps/linux/xtensa/__longjmp.S | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/libc/sysdeps/linux/xtensa/__longjmp.S b/libc/sysdeps/linux/xtensa/__longjmp.S index 0fa939095..acc0b4ff2 100644 --- a/libc/sysdeps/linux/xtensa/__longjmp.S +++ b/libc/sysdeps/linux/xtensa/__longjmp.S @@ -14,9 +14,8 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street - Fifth Floor, - Boston, MA 02110-1301, USA. */ + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ /* This implementation relies heavily on the Xtensa register window mechanism. Setjmp flushes all the windows except its own to the @@ -49,6 +48,7 @@ ENTRY (__longjmp) +#if defined(__XTENSA_WINDOWED_ABI__) /* Invalidate all but the current window. Reading and writing special registers WINDOWBASE and WINDOWSTART are privileged operations, so user processes must call the @@ -84,7 +84,7 @@ ENTRY (__longjmp) slli a4, a7, 4 sub a6, a8, a4 addi a5, a2, 16 - addi a8, a8, -16 // a8 = end of register overflow area + addi a8, a8, -16 /* a8 = end of register overflow area */ .Lljloop: l32i a7, a5, 0 l32i a4, a5, 4 @@ -105,8 +105,8 @@ ENTRY (__longjmp) case the contents were moved by an alloca after calling setjmp. This is a bit paranoid but it doesn't cost much. */ - l32i a7, a2, 4 // load the target stack pointer - addi a7, a7, -16 // find the destination save area + l32i a7, a2, 4 /* load the target stack pointer */ + addi a7, a7, -16 /* find the destination save area */ l32i a4, a2, 48 l32i a5, a2, 52 s32i a4, a7, 0 @@ -121,6 +121,22 @@ ENTRY (__longjmp) movnez a2, a3, a3 retw +#elif defined(__XTENSA_CALL0_ABI__) + l32i a0, a2, 0 + l32i a1, a2, 4 + l32i a12, a2, 8 + l32i a13, a2, 12 + l32i a14, a2, 16 + l32i a15, a2, 20 + + /* Return v ? v : 1. */ + movi a2, 1 + movnez a2, a3, a3 + + ret +#else +#error Unsupported Xtensa ABI +#endif END (__longjmp) libc_hidden_def (__longjmp) |
