| /* | 
 |  * Beat hypervisor call I/F | 
 |  * | 
 |  * (C) Copyright 2007 TOSHIBA CORPORATION | 
 |  * | 
 |  * This code is based on arch/powerpc/platforms/pseries/hvCall.S. | 
 |  * | 
 |  * 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. | 
 |  * | 
 |  * This program is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |  * GNU General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU General Public License along | 
 |  * with this program; if not, write to the Free Software Foundation, Inc., | 
 |  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 
 |  */ | 
 |  | 
 | #include <asm/ppc_asm.h> | 
 |  | 
 | /* Not implemented on Beat, now */ | 
 | #define	HCALL_INST_PRECALL | 
 | #define	HCALL_INST_POSTCALL | 
 |  | 
 | 	.text | 
 |  | 
 | #define	HVSC	.long	0x44000022 | 
 |  | 
 | /* Note: takes only 7 input parameters at maximum */ | 
 | _GLOBAL(beat_hcall_norets) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r4 | 
 | 	mr	r4,r5 | 
 | 	mr	r5,r6 | 
 | 	mr	r6,r7 | 
 | 	mr	r7,r8 | 
 | 	mr	r8,r9 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes 8 input parameters at maximum */ | 
 | _GLOBAL(beat_hcall_norets8) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r4 | 
 | 	mr	r4,r5 | 
 | 	mr	r5,r6 | 
 | 	mr	r6,r7 | 
 | 	mr	r7,r8 | 
 | 	mr	r8,r9 | 
 | 	ld	r10,STK_PARAM(R10)(r1) | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 1 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall1) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 2 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall2) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 | 	std	r5,  8(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 3 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall3) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 | 	std	r5,  8(r12) | 
 | 	std	r6, 16(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 4 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall4) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 | 	std	r5,  8(r12) | 
 | 	std	r6, 16(r12) | 
 | 	std	r7, 24(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 5 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall5) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 | 	std	r5,  8(r12) | 
 | 	std	r6, 16(r12) | 
 | 	std	r7, 24(r12) | 
 | 	std	r8, 32(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ | 
 |  | 
 | /* Note: takes only 6 input parameters, 6 output parameters at maximum */ | 
 | _GLOBAL(beat_hcall6) | 
 | 	HMT_MEDIUM | 
 |  | 
 | 	mfcr	r0 | 
 | 	stw	r0,8(r1) | 
 |  | 
 | 	HCALL_INST_PRECALL | 
 |  | 
 | 	std	r4,STK_PARAM(R4)(r1)	/* save ret buffer */ | 
 |  | 
 | 	mr	r11,r3 | 
 | 	mr	r3,r5 | 
 | 	mr	r4,r6 | 
 | 	mr	r5,r7 | 
 | 	mr	r6,r8 | 
 | 	mr	r7,r9 | 
 | 	mr	r8,r10 | 
 |  | 
 | 	HVSC				/* invoke the hypervisor */ | 
 |  | 
 | 	HCALL_INST_POSTCALL | 
 |  | 
 | 	ld	r12,STK_PARAM(R4)(r1) | 
 | 	std	r4,  0(r12) | 
 | 	std	r5,  8(r12) | 
 | 	std	r6, 16(r12) | 
 | 	std	r7, 24(r12) | 
 | 	std	r8, 32(r12) | 
 | 	std	r9, 40(r12) | 
 |  | 
 | 	lwz	r0,8(r1) | 
 | 	mtcrf	0xff,r0 | 
 |  | 
 | 	blr				/* return r3 = status */ |