Message ID | 20190920135823.471-5-grimm@linux.ibm.com |
---|---|
State | RFC |
Headers | show |
Series | PEF support in skiboot | expand |
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 |
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 --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 */