#define _ASM
#define __ASSEMBLY__
#include "macros.h"
#include "libhvcall.h"
#include <termctrl.h>
#include <product.h>

#define HVCALL			.long 0x44000022
	.text
	.align	3

ENTRY(get_print_banner)
	LOAD32(r4, print_version)
	LOAD32(r5, print_version_end)
	std	r4,0(r3)
	std	r5,8(r3)
	blr

ENTRY(hv_generic)
	HVCALL
	blr

/* r3 = char, r4 = hvtermno */
ENTRY(hv_putchar)
	sldi	r6,r3,(24+32)
	li	r3,H_PUT_TERM_CHAR
	li	r5,1
	HVCALL
	blr

/* r3 = hvtermno */
ENTRY(hv_getchar)
	mflr	r10
	bl	.hv_haschar
	mtlr	r10
	cmpwi	cr0,r3,0
	beqlr
	lis	r9,inbuf@h
	ori	r9,r9,inbuf@l
	lwz	r4,20(r9)
	lbzx	r3,r4,r9
	addi	r4,r4,1
	stw	r4,20(r9)
	blr

/* r3 = hvtermno */
ENTRY(hv_haschar)
	mr	r4,r3
	li	r3,-1
	lis	r9,inbuf@h
	ori	r9,r9,inbuf@l
	lwz	r5,16(r9)
	lwz	r6,20(r9)
	cmplw	cr0,r5,r6
	bnelr
	li	r3,H_GET_TERM_CHAR
	HVCALL
	lis	r9,inbuf@h
	ori	r9,r9,inbuf@l
	stw	r4,16(r9)
	li	r3,0
	stw	r3,20(r9)
	cmplwi	cr0,r4,0
	beqlr
	li	r3,-1
	std	r5,0(r9)
	std	r6,8(r9)
	blr

ENTRY(hv_send_crq)
	ld	r5,0(r4)
	ld	r6,8(r4)
	mr	r4,r3
	li	r3,H_SEND_CRQ
	HVCALL
	blr

ENTRY(hv_send_logical_lan)
	li	r11,0	/* no continue token for now */
	mr	r10,r9
	mr	r9,r8
	mr	r8,r7
	mr	r7,r6
	mr	r6,r5
	mr	r5,r4
	mr	r4,r3
	li	r3,H_SEND_LOGICAL_LAN
	HVCALL
	blr

ENTRY(hv_logical_ci_load)
	mr	r5,r4
	mr	r4,r3
	li	r3,H_LOGICAL_CI_LOAD
	HVCALL
	cmpdi	cr0,r3,0
	mr	r3,r4
	beqlr
	li	r3,-1
	blr

ENTRY(hv_logical_ci_store)
	mr	r6,r5
	mr	r5,r4
	mr	r4,r3
	li	r3,H_LOGICAL_CI_STORE
	HVCALL
	blr

ENTRY(hv_logical_memop)
	mr	r8,r7
	mr	r7,r6
	mr	r6,r5
	mr	r5,r4
	mr	r4,r3
	lis	r3,KVMPPC_H_LOGICAL_MEMOP@h
	ori	r3,r3,KVMPPC_H_LOGICAL_MEMOP@l
	HVCALL
	blr

ENTRY(hv_cas)
	mr	r6,r5
	mr	r5,r4
	mr	r4,r3
	lis	r3,KVMPPC_H_CAS@h
	ori	r3,r3,KVMPPC_H_CAS@l
	HVCALL
	blr

	.section ".bss"
inbuf:	.space	16
inlen:	.space	4
inpos:	.space	4
	.text