> -----Original Message----- > From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] > Sent: Wednesday, September 23, 2020 3:42 PM > To: Chang, Abner (HPS SW/FW Technologist) <abner.ch...@hpe.com>; > boot-architecture@lists.linaro.org; Atish Patra <ati...@atishpatra.org> > Cc: Rick Chen <r...@andestech.com>; Atish Patra <atish.pa...@wdc.com>; > Grant Likely <grant.lik...@arm.com>; Ard Biesheuvel <a...@kernel.org> > Subject: Re: EBBR: RISC-V handoff to OS > > On 23.09.20 08:51, Chang, Abner (HPS SW/FW Technologist) wrote: > > > > > >> -----Original Message----- > >> From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] > >> Sent: Wednesday, September 23, 2020 2:18 PM > >> To: Chang, Abner (HPS SW/FW Technologist) <abner.ch...@hpe.com>; > >> boot-architecture@lists.linaro.org; Atish Patra > >> <ati...@atishpatra.org> > >> Cc: Rick Chen <r...@andestech.com>; Atish Patra > >> <atish.pa...@wdc.com>; Grant Likely <grant.lik...@arm.com>; Ard > >> Biesheuvel <a...@kernel.org> > >> Subject: Re: EBBR: RISC-V handoff to OS > >> > >> On 9/23/20 7:24 AM, Chang, Abner (HPS SW/FW Technologist) wrote: > >>> > >>> > >>>> -----Original Message----- > >>>> From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] > >>>> Sent: Tuesday, September 22, 2020 5:30 PM > >>>> To: boot-architecture@lists.linaro.org; Chang, Abner (HPS SW/FW > >>>> Technologist) <abner.ch...@hpe.com>; Atish Patra > >>>> <ati...@atishpatra.org> > >>>> Cc: boot-architecture@lists.linaro.org; Rick Chen > >>>> <r...@andestech.com>; Atish Patra <atish.pa...@wdc.com>; Grant > >>>> Likely <grant.lik...@arm.com>; Ard Biesheuvel <a...@kernel.org> > >>>> Subject: RE: EBBR: RISC-V handoff to OS > >>>> > >>>> Am 22. September 2020 08:30:57 MESZ schrieb "Chang, Abner (HPS > >> SW/FW > >>>> Technologist)" <abner.ch...@hpe.com>: > >>>>> > >>>>> > >>>>>> -----Original Message----- > >>>>>> From: Atish Patra [mailto:ati...@atishpatra.org] > >>>>>> Sent: Tuesday, September 22, 2020 2:08 PM > >>>>>> To: Chang, Abner (HPS SW/FW Technologist) > <abner.ch...@hpe.com> > >>>>>> Cc: Heinrich Schuchardt <xypron.g...@gmx.de>; Atish Patra > >>>>>> <atish.pa...@wdc.com>; boot-architecture@lists.linaro.org; Grant > >>>>> Likely > >>>>>> <grant.lik...@arm.com>; Ard Biesheuvel <a...@kernel.org>; Rick > >> Chen > >>>>>> <r...@andestech.com> > >>>>>> Subject: Re: EBBR: RISC-V handoff to OS > >>>>>> > >>>>>> On Mon, Sep 21, 2020 at 6:11 PM Chang, Abner (HPS SW/FW > >>>>>> Technologist) <abner.ch...@hpe.com> wrote: > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>> -----Original Message----- > >>>>>>>> From: Atish Patra [mailto:ati...@atishpatra.org] > >>>>>>>> Sent: Tuesday, September 22, 2020 2:28 AM > >>>>>>>> To: Heinrich Schuchardt <xypron.g...@gmx.de> > >>>>>>>> Cc: Atish Patra <atish.pa...@wdc.com>; > >>>>>>>> boot-architecture@lists.linaro.org; > >>>>>>>> Grant Likely <grant.lik...@arm.com>; Ard Biesheuvel > >>>>>>>> <a...@kernel.org>; Rick Chen <r...@andestech.com>; Chang, > >> Abner > >>>>>> (HPS > >>>>>>>> SW/FW Technologist) <abner.ch...@hpe.com> > >>>>>>>> Subject: Re: EBBR: RISC-V handoff to OS > >>>>>>>> > >>>>>>>> On Mon, Sep 21, 2020 at 9:23 AM Heinrich Schuchardt > >>>>>>>> <xypron.g...@gmx.de> wrote: > >>>>>>>>> > >>>>>>>>> Hello Atish, > >>>>>>>>> > >>>>>>>>> the UEFI spec has this sentence: > >>>>>>>>> > >>>>>>>>> "When UEFI firmware handoff control to OS, the RISC-V is > >>>>> operated > >>>>>>>>> in machine-mode privilege." (M-mode is the equivalent to EL3 > >>>>>>>>> in > >>>>> ARM). > >>>>>>> Yes, this is a pretty old section in UEFI spec even before > >>>>>>> OpenSBI > >>>>> as I can > >>>>>> remember and haven't been updated to sync with latest status > >>>>>> RISC-V > >>>>> works. > >>>>>>> > >>>>>>>>> > >>>>>>>>> This does not make any sense to me when using a secure > >>>>> execution > >>>>>>>>> environement (SEE) like OpenSBI. > >>>>>>>>> > >>>>>>>>> The hand-off should occur in S-Mode if the CPU supports it and > >>>>>>>>> only in M-Mode when the CPU only supports M-mode. > >>>>>>>>> > >>>>>>>> +Abner > >>>>>>>> > >>>>>>>> Yes. Abner has already submitted an ECR for this & few other > >>>>> RISC-V > >>>>>>>> related changes to UEFI spec. I am not sure about the current > >>>>> status > >>>>>> though. > >>>>>>>> > >>>>>>>> @Abner: Do you know the latest status ? > >>>>>>> Yes, the ECR was submitted to USWG for review, however the > >> meeting > >>>>>>> canceled often recently and the process goes slow. I will keep > >>>>>>> following up > >>>>>>> > >>>>>>>> Maybe you also attach the latest ECR here for a broader review. > >>>>>>> I may not allowed to public ECR here unless all people in the > >>>>> mailing > >>>>>>> list are the members of UEFI org… but the sentence we revised in > >>>>> ECR > >>>>>>> is as below, > >>>>>>> > >>>>>>> "When UEFI firmware handoff control to Supervisor mode OS, > >>>>>>> RISC-V > >>>>> boot > >>>>>> hart must be operated in Supervisor mode, and the memory > >> addressing > >>>>>> must be operated in Bare mode which is no memory address > >>>>>> translation > >>>>> or > >>>>>> protection through the virtual page table entry." > >>>>>>> > >>>>>> > >>>>>> Thanks. > >>>>>> > >>>>>>> We didn’t mention hand-off to M-Mode if CPU only support M- > Mode > >>>>>> because we only verified edk2 RISC-V port in S-Mode with OpenSBI, > >>>>>> but didn’t try it on M-Mode even though the code is ready there. > >>>>>>> > >>>>>> > >>>>>> That's correct. We can't run UEFI applications run time services > >>>>>> in > >>>>> M-mode as > >>>>>> it requires virtual memory in current setup. > >>>>>> I think it is better to keep that way there is a specific demand > >>>>>> and > >>>>> value in > >>>>>> running UEFI applications in M-mode. > >>>>>> > >>>>>>>> > >>>>>>>>> We should prescribe this in the EBBR and somehow get the UEFI > >>>>> spec > >>>>>>>>> fixed afterwards. > >>>>>>>>> > >>>>>>>> > >>>>>>>> I will add it to the RISC-V EBBR PR (haven't sent it yet). > >>>>>>>> > >>>>>>>>> An other issue is the calling convention. Chapter "2.3.7.3 > >>>>>>>>> Detailed Calling Convention" does not describe which registers > >>>>> are > >>>>>>>>> saved by the UEFI payload's entry point and restored by the > >>>>>>>>> payload before calling the UEFI API or returning to the UEFI > >>>>>>>>> payload. This concerns especially registers gp (x3) and tp > >>>>> (x4). > >>>>>>>>> > >>>>>>>>> Into the EBBR or UEFI spec we should put a link to the "RISC-V > >>>>> ELF > >>>>>>>>> psABI specification" > >>>>>>>>> > >>>>> https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf > >>>>>>>>> .md which is referenced by "The RISC-V Instruction Set Manual". > >>>>>>>>> > >>>>>>>>> From the "RISC-V ELF psABI specification" one might conclude > >>>>> that > >>>>>>>>> the UEFI payload should not be allowed to change gp and tp > >>>>> before > >>>>>>>>> calling > >>>>>>>>> ExitBootServices() or SetVirtualAddressMap() whichever occurs > >>>>> last. > >>>>>>>>> > >>>>>>>> > >>>>>>>> Agreed. Thanks for pointing this out. I think this should go > >>>>>>>> into the UEFI spec instead of EBBR spec. Any suggestions ? > >>>>>>> To have this external link is good, I will add this link in ECR. > >>>>>>>> > >>>>>> > >>>>>> Thanks again :). As per Heinrich's suggestion, it would also be > >>>>>> good > >>>>> to add > >>>>>> some text about the state of gp & tp. > >>>>> > >>>>> Ok. I add some text, copied from psABI spec. :) > >>>>> > >>>>> "........ Registers tp and gp should not be modified in the > >>>>> function, > >>>> > >>>> I would not know what "in the function" refers to here. > >>>> > >>>> We have a value of tp and gp passed from the firmware to the > >>>> entry-point of the firmware. We need a definition describing what > >>>> assumptions the firmware may or may not make about the value of tp > >>>> and gp up to ExitBootServices and in SetVirtualAddressMap. I would > >>>> not assume gp and tp to have any firmware related value afterwards. > >>> Ok, I got your point. But do we mention "value of tp and gp passed > >>> from > >> the firmware to the entry-point of the firmware" somewhere in the > >> particular spec? What is the spec of values you pass in tp/gp to the > >> entry point of firmware? > >>> > >>>> > >>>> It would be perfectly ok if the spec said that the firmware should > >>>> make no assumptions about the value of these registers > >>> I don’t think firmware has assumption of value in these registers > >>> because the calling convention doesn't use these two regs. Maybe the > >>> assembly code use these two regs for some purpose but firmware has > >>> to preserve it. The revised version in below, > >>> > >>>> but has to keep the values > >>>> intact during an API call. > >>>> > >>>> The important thing is that we have a clear definition of the > >>>> interface between the firmware and the payload. > >>> > >>> How about this, > >>> "Registers tp and gp are unallocatable and not preserved across the > >> function calls, UEFI firmware implementation of RISC-V platform > >> should keep the values in these two registers intact during entire > >> UEFI firmware boot process, UEFI boot service and runtime service. > >> See “Link to UEFI Specification-Related Document” on > >> https://uefi.org/uefi under the heading “RISC-V EFL psABI > >> Specification” for the more descriptions of RISC-V calling convention." > >> > >> Current situation in U-Boot > >> =========================== > >> > >> With U-Boot we currently have the following boot flows: > >> > >> U-Boot -> payload > >> OpenSBI -> payload > >> U-Boot SPL -> OpenSBI -> U-Boot -> payload HI Heinrich, What is the payload refers here? Is edk2 UEFI payload one of the payloads mentioned here? E.g. OpenSBI->UEFI firmware payload. And what is the term "firmware" refers to? e.g. Uboot is the firmware, edk2 UEFI implementation is also referred as the firmware. Is U-Boot mentioned here is the U-Boot UEFI implementation? I am confused by the terms used in this discussion.
Abner > >> > >> Upon entry U-Boot overwrites tp with the HART id on all HARTs and the > >> boot HART's gp with a pointer to U-Boot's global data structure. > >> > >> At boot time when the payload makes an API call U-Boot replaces the > >> payload's gp by its own value upon entry and restores the payload's > >> gp before returning to the payload. > >> > >> At runtime UBoot neither touches gp nor tp. > >> > >> Interrupt handling > >> ================== > >> > >> Before ExitBootServices() handling of interrupts and exceptions is > >> the task of the firmware. As both may rely on the values of tp and gp > >> the payload should not overwrite them. > >> > >> When the operating system takes over it also has gets the > >> responsibility for handling interrupts and exceptions and will set its own > values of tp and gp. > >> > >> Some operating systems call SetVirtualAddressMap() after > >> ExitBootServices(), others don't. On Linux this is controlled by > >> kernel command line parameter efi=novamap. > >> > >> Conclusion > >> ========== > >> > >> I would suggest the following rules: > >> > >> Until ExitBootServices() returns to the payload the firmware is the > >> owner of registers gp and tp. The payload MUST NOT alter these values. > >> > >> This implies that when handling EVT_SIGNAL_EXIT_BOOT_SERVICES > events > >> the payload MUST NOT alter gp and tp. > >> > >> After ExitBootServices() the payload is the owner of registers gp and > >> tp. The firmware MUST NOT alter these values. > > > > The firmware solution you mentioned above is the payload solution with > either uboot or opensbi. However, edk2 firmware solution is not the same. > RISC-V edk2 firmware solution uses OpenSBI as the library. Thus we don't > have to mention specific firmware solution in UEFI spec. > > I think the final sentence already covered all use cases you mentioned > above, that includes the EFI POST time and the UEFI service exposed to user > such as EFI boot service and EFI runtime service. We don’t have to mention > specific rule in the spec. I revised it again and add EFI Management Mode > service. > > My references to U-Boot where not meant for inclusion in any spec but as > background information only. > > > > > "Registers tp and gp are unallocatable and not preserved across the > function calls, UEFI firmware implementation of RISC-V platform should keep > the values in these two registers intact during entire UEFI firmware boot > process, EFI boot services, EFI runtime services and EFI management mode > services. See “Link to UEFI Specification-Related Document” on > https://uefi.org/uefi under the heading “RISC-V EFL psABI Specification” for > the more descriptions of RISC-V calling convention." > > Please, have a look at RFC 2119 "Key words for use in RFCs to Indicate > Requirement Levels" [INVALID URI REMOVED > 3A__tools.ietf.org_html_rfc2119&d=DwIFaQ&c=C5b8zRQO1miGmBeVZ2LFW > g&r=_SN6FZBN4Vgi4Ulkskz6qU3NYRO03nHp9P7Z5q59A3E&m=M_APpMPr8z > v5FK0ys5Noq10akQQqL0eNc9vlZqmOkpw&s=DBCkr05bpuKrQWdyNn5bJSow > sLV7UDvDJIJc3nT4jd0&e= ]. Here "should" > has the meaning of "recommended" and may be ignored "in particular > circumstances". > > Did you mean SHOULD or MUST? > > "are unallocatable" is vague. It does not describe who is not allowed to > change the values. Is it the firmware or is it the payload? > > "keep the values intact" is vague. It could mean that the firmware SHOULD > reset gp and tp to the values they had had before StartImage() whenever an > API call is made. > > We need a definition that cannot be misunderstood. In my definition it is at > least clear who is the owner of tp and gp. > > Please, consider that before ExitBootServices() many different payloads may > be loaded by the firmware: applications, boot service drivers, runtime service > drivers. This is why to me it does not make sense to allow any other software > but the firmware to define the values of tp and gp before ExitBootServices(). > > Best regards > > Heinrich > > >>>> > >>>>> because signal handlers may rely upon their values. See “Link to > >>>>> UEFI Specification-Related Document” on https://uefi.org/uefi > >>>>> under the heading “RISC-V EFL psABI Specification” for the more > >>>>> descriptions of RISC-V calling convention." > >>>>> > >>>>> > >>>>> I will upload this update to USWG once Heinrich agrees with above. > >>>>> > >>>>>> > >>>>>>>>> Due to this missing clarification U-Boot is currently saving > >>>>>>>>> gp before calling the entry point of the payload and restores > >>>>>>>>> it > >>>>> on > >>>>>>>>> reentry or on entry of an API call. Nothing is done for tp. > >>>>>>>>> _______________________________________________ boot-architecture mailing list boot-architecture@lists.linaro.org https://lists.linaro.org/mailman/listinfo/boot-architecture