diff mbox series

[RFC,6/8] pef: ultra-call support for skiboot

Message ID 20190905132919.8765-7-grimm@linux.ibm.com
State Superseded
Headers show
Series PEF support in Skiboot | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch warning Failed to apply on branch master (7b12d5489fcfd73ef7ec0cb27eff7f8a5f13b238)
snowpatch_ozlabs/apply_patch fail Failed to apply to any branch

Commit Message

Ryan Grimm Sept. 5, 2019, 1:29 p.m. UTC
From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>

A new type of system call called the ultra call is used to get the
services of the ultravisor. This ultracall support is needed in skiboot
to access the xscoms which are in the secure memory area.

Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Signed-off-by: Santosh Sivaraj <santosh@fossix.org>
[ andmike: ABI hange to switch from r0 to r3 ]
Signed-off-by: Michael Anderson <andmike@linux.ibm.com>
[ grimm: Comments to start_uv for register usage ]
Signed-off-by: Ryan Grimm <grimm@linux.ibm.com>
---
 asm/head.S           | 34 +++++++++++++++++++++++++++++++++-
 include/ultravisor.h |  1 +
 2 files changed, 34 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/asm/head.S b/asm/head.S
index 18ce3044..f8808b08 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -1066,6 +1066,11 @@  start_kernel_secondary:
 	mfspr	%r3,SPR_PIR
 	bctr
 
+/* start_uv register usage:
+ *
+ *  r3 is base address of UV
+ *  r4 is ptr to struct uv_opal
+ */
 .global start_uv
 start_uv:
 	mflr    %r0
@@ -1083,7 +1088,34 @@  start_uv:
 	addi    %r7,%r5,1
 	li      %r4,0
 	li      %r5,0
-	bctrl
+	bctrl   /* branch to UV here */
 	ld      %r0,16(%r1)
 	mtlr    %r0
 	blr
+
+.global ucall
+ucall:
+	mflr	%r0
+	stdu	%r1,-STACK_FRAMESIZE(%r1)
+	std	%r0,STACK_LR(%r1)
+	mfcr    %r0
+	stw     %r0,STACK_CR(%r1)
+	std     %r4,STACK_GPR4(%r1)	/* Save ret buffer */
+	mr      %r4,%r5
+	mr      %r5,%r6
+	mr      %r6,%r7
+	mr      %r7,%r8
+	mr      %r8,%r9
+	mr      %r9,%r10
+	sc	2			/* invoke the ultravisor */
+	ld      %r12,STACK_GPR4(%r1)
+	std     %r4,  0(%r12)
+	std     %r5,  8(%r12)
+	std     %r6, 16(%r12)
+	std     %r7, 24(%r12)
+	lwz	%r0,STACK_CR(%r1)
+	mtcrf	0xff,%r0
+	ld	%r0,STACK_LR(%r1)
+	mtlr	%r0
+	addi	%r1,%r1,STACK_FRAMESIZE
+	blr				/* return r3 = status */
diff --git a/include/ultravisor.h b/include/ultravisor.h
index 976b6323..3fc2ecd9 100644
--- a/include/ultravisor.h
+++ b/include/ultravisor.h
@@ -36,5 +36,6 @@  extern void uv_preload_image(void);
 extern void uv_decompress_image(void);
 extern void init_uv(void);
 extern int start_ultravisor(void);
+extern long ucall(unsigned long opcode, unsigned long *retbuf, ...);
 
 #endif /* __ULTRAVISOR_H */