diff mbox series

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

Message ID 20190920135823.471-5-grimm@linux.ibm.com
State RFC
Headers show
Series PEF support in skiboot | expand

Checks

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

Commit Message

Ryan Grimm Sept. 20, 2019, 1:58 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(-)

Comments

Oliver O'Halloran Nov. 17, 2019, 11:51 p.m. UTC | #1
On Sat, Sep 21, 2019 at 12:01 AM Ryan Grimm <grimm@linux.ibm.com> wrote:
>
> 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 --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

The comments should go into the patch that adds start_uv.

> +.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 b49121ce..67be743f 100644
> --- a/include/ultravisor.h
> +++ b/include/ultravisor.h
> @@ -23,5 +23,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 */
> --
> 2.21.0
>
> _______________________________________________
> Skiboot mailing list
> Skiboot@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
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 b49121ce..67be743f 100644
--- a/include/ultravisor.h
+++ b/include/ultravisor.h
@@ -23,5 +23,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 */