[BACK]Return to setjmp.c CVS log [TXT][DIR] Up to [Development] / linux-2.4-xfs / arch / ppc64 / xmon

File: [Development] / linux-2.4-xfs / arch / ppc64 / xmon / setjmp.c (download)

Revision 1.1, Wed Dec 31 00:54:49 2003 UTC (13 years, 10 months ago) by cattelan
Branch: MAIN
CVS Tags: HEAD

Initial Import 2.4.24pre2

/*
 * 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));
}