[Skiboot] [RFC PATCH v4 07/16] Add ultra call support for skiboot

Ryan Grimm grimm at linux.ibm.com
Thu Feb 27 23:20:33 AEDT 2020


From: Madhavan Srinivasan <maddy at 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 at linux.vnet.ibm.com>
Signed-off-by: Santosh Sivaraj <santosh at fossix.org>
[ andmike: ABI change to switch from r0 to r3 ]
Signed-off-by: Michael Anderson <andmike at linux.ibm.com>
---
 asm/misc.S           | 27 +++++++++++++++++++++++++++
 include/ultravisor.h |  1 +
 2 files changed, 28 insertions(+)

diff --git a/asm/misc.S b/asm/misc.S
index 9d2f3b6e..8dca77b0 100644
--- a/asm/misc.S
+++ b/asm/misc.S
@@ -316,3 +316,30 @@ exit_uv_mode:
         mflr    %r4
         mtspr   SPR_USRR0,%r4
         urfid
+
+.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 44cf36bf..148041a0 100644
--- a/include/ultravisor.h
+++ b/include/ultravisor.h
@@ -9,6 +9,7 @@
 
 #define UV_LOAD_MAX_SIZE        0x200000
 
+extern long ucall(unsigned long opcode, unsigned long *retbuf, ...);
 extern int start_uv(uint64_t entry, void *fdt);
 
 int start_ultravisor(void *fdt);
-- 
2.21.0



More information about the Skiboot mailing list