/*
* Copyright (C) 1996 Paul Mackerras.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* NB this file must be compiled with -O2.
*/
int
xmon_setjmp(long *buf) /* NOTE: assert(sizeof(buf) > 184) */
{
/* XXX should save fp regs as well */
asm volatile (
"mflr 0; std 0,0(%0)\n\
std 1,8(%0)\n\
std 2,16(%0)\n\
mfcr 0; std 0,24(%0)\n\
std 13,32(%0)\n\
std 14,40(%0)\n\
std 15,48(%0)\n\
std 16,56(%0)\n\
std 17,64(%0)\n\
std 18,72(%0)\n\
std 19,80(%0)\n\
std 20,88(%0)\n\
std 21,96(%0)\n\
std 22,104(%0)\n\
std 23,112(%0)\n\
std 24,120(%0)\n\
std 25,128(%0)\n\
std 26,136(%0)\n\
std 27,144(%0)\n\
std 28,152(%0)\n\
std 29,160(%0)\n\
std 30,168(%0)\n\
std 31,176(%0)\n\
" : : "r" (buf));
return 0;
}
void
xmon_longjmp(long *buf, int val)
{
if (val == 0)
val = 1;
asm volatile (
"ld 13,32(%0)\n\
ld 14,40(%0)\n\
ld 15,48(%0)\n\
ld 16,56(%0)\n\
ld 17,64(%0)\n\
ld 18,72(%0)\n\
ld 19,80(%0)\n\
ld 20,88(%0)\n\
ld 21,96(%0)\n\
ld 22,104(%0)\n\
ld 23,112(%0)\n\
ld 24,120(%0)\n\
ld 25,128(%0)\n\
ld 26,136(%0)\n\
ld 27,144(%0)\n\
ld 28,152(%0)\n\
ld 29,160(%0)\n\
ld 30,168(%0)\n\
ld 31,176(%0)\n\
ld 0,24(%0)\n\
mtcrf 0x38,0\n\
ld 0,0(%0)\n\
ld 1,8(%0)\n\
ld 2,16(%0)\n\
mtlr 0\n\
mr 3,%1\n\
" : : "r" (buf), "r" (val));
}