aboutsummaryrefslogtreecommitdiff
path: root/lib/libhvcall/hvcall.S
blob: e28dbeb68cc88d5313f7e50d3fd8b6d8f08bb0c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#define _ASM
#define __ASSEMBLY__
#include "macros.h"
#include "libhvcall.h"
	
#define HVCALL			.long 0x44000022
	
	.text
	.align	3

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

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