On 25.09.20 16:42, Chang, Abner (HPS SW/FW Technologist) wrote: > > >> -----Original Message----- >> From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] >> Sent: Friday, September 25, 2020 6:26 PM >> To: Chang, Abner (HPS SW/FW Technologist) <abner.ch...@hpe.com>; Ard >> Biesheuvel <a...@kernel.org> >> Cc: Atish Patra <atish.pa...@wdc.com>; boot-architecture@lists.linaro.org; >> Grant Likely <grant.lik...@arm.com>; Rick Chen <r...@andestech.com>; >> Atish Patra <ati...@atishpatra.org> >> Subject: Re: EBBR: RISC-V handoff to OS >> >> On 9/25/20 8:06 AM, Chang, Abner (HPS SW/FW Technologist) wrote: >>> >>> >>>> -----Original Message----- >>>> From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] >>>> Sent: Thursday, September 24, 2020 8:43 PM >>>> To: Ard Biesheuvel <a...@kernel.org> >>>> Cc: Chang, Abner (HPS SW/FW Technologist) <abner.ch...@hpe.com>; >>>> boot-architecture@lists.linaro.org; Atish Patra >>>> <ati...@atishpatra.org>; Rick Chen <r...@andestech.com>; Atish Patra >>>> <atish.pa...@wdc.com>; Grant Likely <grant.lik...@arm.com> >>>> Subject: Re: EBBR: RISC-V handoff to OS >>>> >>>> On 24.09.20 14:05, Ard Biesheuvel wrote: >>>>> On Thu, 24 Sep 2020 at 08:07, Heinrich Schuchardt >>>>> <xypron.g...@gmx.de> >>>> wrote: >>>>>> >>>>>> On 9/24/20 5:35 AM, Chang, Abner (HPS SW/FW Technologist) wrote: >>>>>>> Ok Heinrich, thanks for the clarification. I also read through >>>>>>> this thread >>>> again and understand the intention you would like to have some >>>> sentences in the UEFI spec. >>>>>>> >>>>>>> I realize that we are trying to put sentences in the RISC-V >>>>>>> calling >>>> convention in UEFI spec to support the specific UEFI firmware >>>> implementation of using gp/tp. >>>>>>> Uboot UEFI firmware uses tp in HART to record the HART ID and uses >>>>>>> gp >>>> in the boot-HART to maintain the global data structure of uboot. >>>>>> >>>>>> tp is only used to store information on the secondary harts which >>>>>> does not enter the UEFI payload. So for U-Boot the only problematic >>>>>> register is gp. >>> If you are using opensbi solution, you should consider to use firmware >> context mechanism because that is designed for any firmware solutions to >> maintain its own data structure for any purposes. >> >> I will have a look at it. > If you would like to know how do we define and initial the firmware context, > then you can check > https://github.com/tianocore/edk2-platforms/blob/master/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c > and > https://github.com/tianocore/edk2-platforms/blob/master/Silicon/RISC-V/ProcessorPkg/Include/IndustryStandard/RiscVOpensbi.h. > Thus the data structure you put in gp could be in firmware context, also > means that we don’t need that much constraints mentioned in UEFI spec. > We can still submit that paragraph to USWG, but it would be hard to remove it > from UEFI spec if once day we don’t need it for the backward compatibility. > >> Thanks for the link below. > Below link is for the edk2 opensbi firmware extensions. > >> >>> >>>>>> >>>>> >>>>> Secondary CPUs could be used to invoke runtime services, though. >>>>> >>>>>>> The reason I can think of the reason to use tp/gp is because >>>>>>> S-Mode >>>> UEFI firmware (or S-mode payload?) is not able to get mhartid, so >>>> uboot stores HART ID in tp. Because there is nowhere to maintain the >>>> global data structure for uboot and the mscratch is occupied by >>>> opensbi, thus uboot uses gp to maintain the pointer to global context. >>>>>>> Because both tp and gp are non-privileged registers so uboot (or >>>>>>> payload?) can get the information from those registers easily, >>>>>>> right? (But is this a security hole that any software can hack >>>>>>> tp/gp? However, this is the different topic, just ignore this) >>>>>> >>>>>> As said U-Boot restores value of gp when entered from UEFI via the >> API. >>>>>> >>>>>> We should do the same when serving interrupts and exceptions. >>>>>> >>>>> >>>>> When? >>>>> >>>>> We should carefully consider the difference between before-EBS and >>>>> after-EBS here: >>>>> >>>>> Before EBS: >>>>> Interrupt/exception handlers are owned by the UEFI firmware (Uboot >>>>> or EDK2). The OS or any other EFI payload must not interfere with >>>>> this, and only use function call interfaces to interact with the system. >>>> >>>> There is a gap in U-Boot for interrupts/exceptions before >>>> ExitBootServices() that I will have to close. >>>> >>>> Best regards >>>> >>>> Heinrich >>>> >>>>> >>>>> After EBS: >>>>> Interrupt/exception handlers are owned by the OS. The UEFI firmware >>>>> can be entered on any CPU with interrupts enabled or disabled, and >>>>> the UEFI firmware should not interfere with interrupt handling or >>>>> exception vectors etc. >>>>> >>>>> >>>>> >>>>>> Concerning security we have to remember that an UEFI payload has >>>>>> the same powers as the firmware itself. When it comes to hacking >>>>>> you have lost once you execute a hostile payload. What we can try >>>>>> to guard against to some degree are non-compliant payloads. >>>>>> >>>>> >>>>> Agreed. Everything runs at the same permission level, so any >>>>> software running under UEFI has the same powers as the UEFI firmware >> itself. >>>>> >>>>>>> Did we spec out above behavior in uboot RISC-V spec or the >>>> implementation design guide at somewhere? I am not quite familiar >>>> with uboot area though. >>>>>> >>>>>> The patch series >>>>>> >>>>>> doc: global data pointer >>>>>> INVALID URI REMOVED >>>> 3A__patchwork.ozlabs >>>>>> .org_project_uboot_list_-3Fseries- >>>> 3D202971&d=DwIFaQ&c=C5b8zRQO1miGmBe >>>>>> >>>> >> VZ2LFWg&r=_SN6FZBN4Vgi4Ulkskz6qU3NYRO03nHp9P7Z5q59A3E&m=QMu >>>> q0JhboDWbE >>>>>> qbx6d4dZeXY2Pk0-PICJzRJKNT4wRY&s=UjTczoF1vjt5- >>>> uUzkvB6QFgGIsCUpuTMrSjX >>>>>> Zh8LbGA&e= >>>>>> >>>>>> starts closing the documentation gap in U-Boot. >>>>>> >>>>>>> >>>>>>> Another problem comes to my mind is even though we save gp/tp >> upon >>>> the entry of ExitBootService (or other UEFI APIs) and replaced with >>>> the uboot ones, what if the interrupt/exception happens and delegated >>>> to the payload event handler during ExitBootService (or other UEFI >>>> APIs)? The ownership is messed up at this point, right? >>>>>> >>>>>> UEFI spec 2.8B chapter 2.3.7 "RISC-V Platforms" has: >>>>>> >>>>>> The processor is in the following execution mode during boot service: >>>>>> The machine mode interrupt is enabled during boot service in UEFI. >>>>>> Two kinds of interrupts are enabled, one is for timer interrupt and >>>>>> another is software interrupt >>>>>> >>>>>> All other architectures except RISC-V describe the usage of runtime >>>>>> services by the OS with the following sentences: >>>>>> >>>>>> For an operating system to use any runtime services, it must: Call >>>>>> the runtime service functions, with the following conditions: >>>>>> Interrupts may be disabled or enabled at the discretion of the caller. >>>>>> >>>>>> So the rule of thumb is: Until ExitBootServices() returns the >>>>>> firmware serves interrupts and exceptions. After ExitBootServices() >>>>>> returns it is the operating system. >>>>>> >>>>>> In the AAarch64 chapter I found: >>>>>> >>>>>> "An alternate execution environment can restore the firmware >>>>>> environment before each UEFI call. However the possibility of >>>>>> preemption may require the alternate execution-enabled application >>>>>> to disable interrupts while the alternate execution environment is >>>>>> active. It's legal for the alternate execution environment enabled >>>>>> application to enable interrupts if the application catches the >>>>>> interrupt and restores the EFI firmware environment prior to >>>>>> calling the >>>> UEFI interrupt ISR." >>>>>> >>>>>> I am not aware of an implementation of such an "alternate execution >>>>>> environment". But an alternative execution environment serving >>>>>> interrupts while calling the UEFI API and relying on values that it >>>>>> has put into gp would not work on current U-Boot. >>>>>> >>>>>>> >>>>>>> In edk2 RISC-V port, we use "firmware_context" in sbi_platforms >>>>>>> which >>>> provided opensbi through mscratch to maintain the firmware specific >> context. >>>> With this, firmware can maintain its own data structure without >>>> bothering any other industrial specs. Because S-Mode firmware can't >>>> access to mhartid and the sbi-scratch which is stored in mscratch, >>>> so we have Edk2OpensbiLib that registers the firmware specific sbi >>>> extension functions using "Firmware Code Base Specific SBI Extension >>>> Space, Extension Ids 0x0A000000 through 0x0AFFFFFF" defined in sbi >>>> spec. That is a separate spec for RISC-V edk2 firmware sbi extension >> function (This reminds me I forget to document it). >>>> Then edk2 can get the necessary information using edk2 extension sbi call. >>>>>>> >>>>>> >>>>>> Thank you for pointing me at Edk2OpensbiLib. Where can I find the >> code? >>> Here it is, >>> https://github.com/tianocore/edk2-platforms/tree/master/Silicon/RISC-V >>> /ProcessorPkg/Library/RiscVEdk2SbiLib >>> >>>>>> >>>>>> I will have to keep in mind that U-Boot can be used both with and >>>>>> without an SEE. >>>>>> >>>>>>> You would agree with that we don’t have to mention the gp/tp usage >>>>>>> in >>>> the calling convention just because of the uboot implementation. And >>>> we don’t have mention any connection/relationship between gp/tp >>>> usage and the specific UEFI firmware implementation. The sentence >>>> must be also generic to other UEFI firmware solutions such as edk2 >>>> which doesn't care about destroying gp/tp (so far). >>>>>> >>>>>> I fully agree that specifications precede implementations. >>>>>> >>>>>>> >>>>>>> In the RISC-V assembly programmer's handbook in RISC-V spec, gp/tp >>>> are not given either the caller or callee to save the value, so we >>>> can spec out something in UEFI spec based on this calling convention. >>>>>> >>>>>> Jessica Clarke pointed me to the "RISC-V ELF psABI specification" >>>>>> (https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf >>>>>> .m >>>>>> d) which defines the usage of tp and gp in the RISC-V world: >>>>>> >>>>>> "In the standard ABI, procedures should not modify the integer >>>>>> registers tp and gp, because signal handlers may rely upon their >> values." >>>>>> >>>>>> So here the idea is that whoever serves interrupts and exceptions >>>>>> is the owner of gp and tp. >>>>>> >>>>>> After ExitBootServices() signals are served by the operating system. >>>>>> It takes hold of the values of tp and gp. See these lines of the Linux >> kernel: >>>>>> >>>>>> arch/riscv/kernel/entry.S:97: >>>>>> la gp, __global_pointer$ >>>>>> >>>>>> arch/riscv/kernel/head.S:253: >>>>>> la tp, init_task >>>>>> >>>>>> Every time Linux enters kernel mode it again sets its own values of >>>>>> gp and tp. This addresses the security problem that you mentioned >> above. >>>>>> >>>>>>> >>>>>>> The sentence which I consider reasonable is , "In view of gp and >>>>>>> tp registers are not assigned the specific owner to save and >>>>>>> restore their >>>> values in the calling convention (refer to "RISC-V assembly >>>> programmer's handbook" section in RISC-V Unprivileged ISA >>>> specification), UEFI firmware must not having assumption of owning >>>> the write access to these register at any circumstances such as in >>>> EFI Boot service, EFI Runtime service, EFI Management Mode service >>>> and in any UEFI firmware interfaces which may invoked by the external >>>> firmware payload, or altering the values of gp/tp registers results >>>> in the interference in the asynchronous callback to the external >>>> firmware payload . Whether and how to preserve gp and tp during UEFI >>>> firmware environment is UEFI firmware implementation-specific. RISC- >>>> V platform firmware integrator should refer to the corresponding design >> specification of the particular UEFI firmware solution." >> >> Thanks for this description which looks fine to me. > I think you are fine with the below description but not the above one, right? >> Maybe a native English speaker can clean it up a bit. > >> >> Best regards >> >> Heinrich >> >>>>>>> >>>>>> >>>>>> We should start with a reference of the "RISC-V ELF psABI >> specification" >>>>>> to explain the usage of gp and tp. >>>>>> >>>>>> It seems to be necessary and sufficient for the firmware to follow: >>>>>> >>>>>> * Don't trust the values of tp and gp when entered >>>>>> from the payloads world. >>>>>> * If you need to change them, restore the values before returning. >>>>>> * Never touch tp and gp after ExitBootServices(). >>>>>> >>>>>> The same should be observed by an interrupt or exception handler >>>>>> provided by an "alternative execution environment". >>>>>> >>>>>> Best regards >>> How about this, >>> >>> In view of the statement "In the standard ABI, procedures should not >> modify the integer registers tp and gp, because signal handlers may rely >> upon their values." mentioned in RISC-V EFL psABI Specification (See “Link to >> UEFI Specification-Related Document” on https://uefi.org/uefi under the >> heading “RISC-V EFL psABI Specification”) and the RISC-V calling convention >> that gp and tp registers are not assigned the specific owner to save and >> restore their values (refer to "RISC-V assembly programmer's handbook" >> section in RISC-V Unprivileged ISA specification). UEFI firmware must >> neither trusting the values of tp and gp nor having assumption of owning the >> write access to these register at any circumstances (Such as in EFI Boot >> service, EFI Runtime service, EFI Management Mode service and any UEFI >> firmware interfaces which may invoked by the EFI drivers, OS or external >> firmware payload). Preserve the values in gp or tp register if UEFI firmware >> needs to change them and never touches them after ExitBootServices(). >> Whether and how to preserve gp and tp during UEFI firmware environment >> is UEFI firmware implementation-specific.
Sorry my review commet got misplaced. Yes the text above this line is fine. Best regards Heinrich >>> >>> >>>>>> >>>>>> Heinrich >>>>>> >>>>>>> I believe this initial sentence still needs some revises, please >>>>>>> just modify >>>> above paragraph if you don't like it. We can keep discussing this >>>> based on above paragraph. >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: Heinrich Schuchardt [mailto:xypron.g...@gmx.de] >>>>>>>> Sent: Thursday, September 24, 2020 2:20 AM >>>>>>>> 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 5:01 PM, Chang, Abner (HPS SW/FW Technologist) wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>>> -----Original Message----- >>>>>>>>>> From: Chang, Abner (HPS SW/FW Technologist) >>>>>>>>>> Sent: Wednesday, September 23, 2020 10:55 PM >>>>>>>>>> To: 'Heinrich Schuchardt' <xypron.g...@gmx.de>; boot- >>>>>>>>>> architect...@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 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> -----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/ >>>>>>>>>>>>>>>> ri >>>>>>>>>>>>>>>> scv- >>>>>>>>>>>>>>>> e >>>>>>>>>>>>>>>> lf >>>>>>>>>>>>>>>>>>>> .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 >>>>>>>>>>>>> >>>>>>>>>>>>> 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? >>>>>>>>>> MUST is better, to make UEFI firmware solution simple. UEFI >>>>>>>>>> edk2 implementation could be a stand along firmware or to be >>>>>>>>>> built as the payload (we don’t have this implementation yet). >>>>>>>>>>> >>>>>>>>>>> "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? >>>>>>>>>> From UEFI perspective, UEFI firmware payload is not allowed to >>>>>>>>>> change the value. I will rephrase this sentence. >>>>>>>>>>> >>>>>>>>>>> "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(). >>>>>>>>>> >>>>>>>>>> I am not against that firmware to define the values of tp and >>>>>>>>>> gp. I think the "firmware" you mentioned here refer to uboot >>>>>>>>>> but not edk2 >>>>>>>> firmware. >>>>>>>> >>>>>>>> I refer to the firmware providing the UEFI API. U-Boot and EDK II >>>>>>>> are alternative implementations. >>>>>>>> >>>>>>>>>> I am also fine to mention UEFI firmware should not (Must not) >>>>>>>>>> use gp and tp in spec. I would like to restrict using these two >>>>>>>>>> registers in UEFI firmware no matter the RISC-V UEFI firmware >>>>>>>>>> implementation is a stand along system firmware or a payload >>>>>>>>>> for other firmware such as uboot/opensbi, this would be easier >>>>>>>>>> for us to maintain RISC-V edk2 port. Hope I don’t misunderstand >>>>>>>> >>>>>>>> Both U-Boot and EDK II may be started by an SEE, e.g. OpenSBI. >>>>>>>> >>>>>>>>>> the intention which you brought up here, which is the UEFI >>>>>>>>>> firmware payload must not altering the value of gp and tp, right? >>>>>>>>>> >>>>>>>>>> However, I don’t want to see that we list the specific >>>>>>>>>> functions such as ExitBootServices, startImage, >>>>>>>>>> SetVirtualAddress in the UEFI spec, we can just give the strict >>>>>>>>>> criteria to UEFI firmware to not >>>> using gp/tp. >>>>>>>>>> Says UEFI firmware can't alter tp/gp values, >>>>>>>>>> - After firmware enters UEFI firmware payload and before >>>>>>>>>> returning to >>>>>>>>>> firmware>> - In BS >>>>>>>>>> - In RTS >>>>>>>>>> - In SMM service >>>>>>>> >>>>>>>> Everytime U-Boot code is entered during boot services the >>>>>>>> payloads gp is saved. When returning to the payload the payloads >>>>>>>> value of the gp is restored. So the payload cannot observe any >> change in gp. >>>>>>>> At runtime U- Boot does not touch gp. >>>>>>>> >>>>>>>> I hope that is in line with your suggestion. >>>>>>>> >>>>>>>> Best regards >>>>>>>> >>>>>>>> Heinrich >>>>>>>> >>>>>>>>>> These should cover all possibilities of gp/tp value changed in >>>>>>>>>> UEFI >>>>>>>> firmware. >>>>>>>>>> We don’t even have to define the ownership of these registers >>>>>>>>>> in UEFI >>>>>>>> spec. >>>>>>>>> BTW, above is based on the edk2 UEFI implementation. I am not >>>>>>>>> sure if >>>>>>>> other UEFI firmware implementation can avoid to use these >> registers. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 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 >>> > _______________________________________________ boot-architecture mailing list boot-architecture@lists.linaro.org https://lists.linaro.org/mailman/listinfo/boot-architecture