@@ -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 */
@@ -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 */