aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMadhavan Srinivasan <maddy@linux.vnet.ibm.com>2019-08-30 08:10:33 -0400
committerRam Pai <linuxram@us.ibm.com>2020-11-02 19:35:09 -0500
commit4d79433502d697a138625e6ca17d66590bc39d44 (patch)
tree8d6efb15936b1b10a15720997a6d72b87a7caf61
parent1159dbc364b8cb839c42147c687070c18d52c07c (diff)
downloadskiboot-4d79433502d697a138625e6ca17d66590bc39d44.zip
skiboot-4d79433502d697a138625e6ca17d66590bc39d44.tar.gz
skiboot-4d79433502d697a138625e6ca17d66590bc39d44.tar.bz2
pef: ultra-call support for skiboot
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>
-rw-r--r--asm/head.S34
-rw-r--r--include/ultravisor.h1
2 files changed, 34 insertions, 1 deletions
diff --git a/asm/head.S b/asm/head.S
index 18ce304..f8808b0 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 a8310ac..04bacec 100644
--- a/include/ultravisor.h
+++ b/include/ultravisor.h
@@ -25,5 +25,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 */