/*
 * arch/ppc64/kernel/pSeries_hvCall.S
 *
 * This file contains the generic code to perform a call to the
 * pSeries LPAR hypervisor.
 * NOTE: this file will go away when we move to inline this work.
 *
 * 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.
 */
#include <asm/hvcall.h>
#include <asm/processor.h>
#include <asm/ppc_asm.h>
	
#define STK_PARM(i)     (48 + ((i)-3)*8)

	.text

/* long plpar_hcall(unsigned long opcode,		R3
			unsigned long arg1,		R4
			unsigned long arg2,		R5
			unsigned long arg3,		R6
			unsigned long arg4,		R7
			unsigned long *out1,		R8
			unsigned long *out2,		R9
			unsigned long *out3);		R10
 */
_GLOBAL(plpar_hcall)
	HMT_MEDIUM

	mfcr	r0

	std	r8,STK_PARM(r8)(r1)	/* Save out ptrs */
	std	r9,STK_PARM(r9)(r1)
	std	r10,STK_PARM(r10)(r1)

	stw	r0,8(r1)

	HVSC				/* invoke the hypervisor */

	lwz	r0,8(r1)

	ld	r8,STK_PARM(r8)(r1)	/* Fetch r4-r6 ret args */
	ld	r9,STK_PARM(r9)(r1)
	ld	r10,STK_PARM(r10)(r1)
	std	r4,0(r8)
	std	r5,0(r9)
	std	r6,0(r10)

	mtcrf	0xff,r0
	blr				/* return r3 = status */


/* Simple interface with no output values (other than status) */
_GLOBAL(plpar_hcall_norets)
	HMT_MEDIUM

	mfcr	r0
	stw	r0,8(r1)

	HVSC				/* invoke the hypervisor */

	lwz	r0,8(r1)
	mtcrf	0xff,r0
	blr				/* return r3 = status */


/* long plpar_hcall_8arg_2ret(unsigned long opcode,	R3
			unsigned long arg1,		R4
			unsigned long arg2,		R5
			unsigned long arg3,		R6
			unsigned long arg4,		R7
			unsigned long arg5,		R8
			unsigned long arg6,		R9
			unsigned long arg7,		R10
			unsigned long arg8,		112(R1)
			unsigned long *out1);		120(R1)
 */
_GLOBAL(plpar_hcall_8arg_2ret)
	HMT_MEDIUM

	mfcr	r0
	ld	r11,STK_PARM(r11)(r1)	/* put arg8 in R11 */
	stw	r0,8(r1)

	HVSC				/* invoke the hypervisor */

	lwz	r0,8(r1)
	ld	r10,STK_PARM(r12)(r1)	/* Fetch r4 ret arg */
	std	r4,0(r10)
	mtcrf	0xff,r0
	blr				/* return r3 = status */


/* long plpar_hcall_4out(unsigned long opcode,		R3
		 	unsigned long arg1,		R4
		 	unsigned long arg2,		R5
		 	unsigned long arg3,		R6
		 	unsigned long arg4,		R7
		 	unsigned long *out1,		R8
		 	unsigned long *out2,		R9
		 	unsigned long *out3,		R10
		 	unsigned long *out4);		112(R1)
 */
_GLOBAL(plpar_hcall_4out)
	HMT_MEDIUM

	mfcr	r0
	stw	r0,8(r1)

	std	r8,STK_PARM(r8)(r1)	/* Save out ptrs */
	std	r9,STK_PARM(r9)(r1)
	std	r10,STK_PARM(r10)(r1)

	HVSC				/* invoke the hypervisor */

	lwz	r0,8(r1)

	ld	r8,STK_PARM(r8)(r1)	/* Fetch r4-r7 ret args */
	ld	r9,STK_PARM(r9)(r1)
	ld	r10,STK_PARM(r10)(r1)
	ld	r11,STK_PARM(r11)(r1)
	std	r4,0(r8)
	std	r5,0(r9)
	std	r6,0(r10)
	std	r7,0(r11)

	mtcrf	0xff,r0
	blr				/* return r3 = status */
