* Problem in EFI_BOOT_SERVICES.OpenProtocol() @ 2017-06-01 16:46 Amit kumar 2017-06-01 16:58 ` Andrew Fish 0 siblings, 1 reply; 8+ messages in thread From: Amit kumar @ 2017-06-01 16:46 UTC (permalink / raw) To: edk2-devel@lists.01.org Hi, I am trying to open PciIoProtocol and facing some issue. below is the code EFI_PCI_IO_PROTOCOL *PciIo=NULL; EFI_STATUS Status; Status = gBS->OpenProtocol ( Controller, &gEfiPciIoProtocolGuid, (VOID **) &PciIo, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. Is it not supposed to return PciIo as NULL ? As per UEFI 2.6 Spec Section 6.3 page 182. There are a number of reasons that this function call can return an error. If an error is returned, then AgentHandle, ControllerHandle, and Attributes are not added to the list of agents consuming the protocol interface specified by Handle and Protocol, and Interface is returned unmodified. Thanks And Regards Amit ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 16:46 Problem in EFI_BOOT_SERVICES.OpenProtocol() Amit kumar @ 2017-06-01 16:58 ` Andrew Fish 2017-06-01 17:13 ` Amit kumar 0 siblings, 1 reply; 8+ messages in thread From: Andrew Fish @ 2017-06-01 16:58 UTC (permalink / raw) To: Amit kumar; +Cc: edk2-devel@lists.01.org > On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Hi, > I am trying to open PciIoProtocol and facing some issue. > > below is the code > > EFI_PCI_IO_PROTOCOL *PciIo=NULL; > EFI_STATUS Status; > > Status = gBS->OpenProtocol ( > Controller, > &gEfiPciIoProtocolGuid, > (VOID **) &PciIo, > This->DriverBindingHandle, > Controller, > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > > it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. > Is it not supposed to return PciIo as NULL ? > As per UEFI 2.6 Spec Section 6.3 page 182. > Amit, Look at the Status Codes Returned section at the end of that section. Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. Thanks, Andrew Fish > There are a number of reasons that this function call can return an error. If an error is returned, then > AgentHandle, ControllerHandle, and Attributes are not added to the list of agents > consuming the protocol interface specified by Handle and Protocol, and Interface is > returned unmodified. > > Thanks And Regards > Amit > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 16:58 ` Andrew Fish @ 2017-06-01 17:13 ` Amit kumar 2017-06-01 17:29 ` Andrew Fish 0 siblings, 1 reply; 8+ messages in thread From: Amit kumar @ 2017-06-01 17:13 UTC (permalink / raw) To: Andrew Fish; +Cc: edk2-devel@lists.01.org Hello Andrew, As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. Is this not a problem ? Status = gBS->OpenProtocol ( Controller, &gEfiPciIoProtocolGuid, (VOID **) &PciIo, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); ________________________________ From: afish@apple.com <afish@apple.com> on behalf of Andrew Fish <afish@apple.com> Sent: Thursday, June 1, 2017 10:28:16 PM To: Amit kumar Cc: edk2-devel@lists.01.org Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Hi, > I am trying to open PciIoProtocol and facing some issue. > > below is the code > > EFI_PCI_IO_PROTOCOL *PciIo=NULL; > EFI_STATUS Status; > > Status = gBS->OpenProtocol ( > Controller, > &gEfiPciIoProtocolGuid, > (VOID **) &PciIo, > This->DriverBindingHandle, > Controller, > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > > it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. > Is it not supposed to return PciIo as NULL ? > As per UEFI 2.6 Spec Section 6.3 page 182. > Amit, Look at the Status Codes Returned section at the end of that section. Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. Thanks, Andrew Fish > There are a number of reasons that this function call can return an error. If an error is returned, then > AgentHandle, ControllerHandle, and Attributes are not added to the list of agents > consuming the protocol interface specified by Handle and Protocol, and Interface is > returned unmodified. > > Thanks And Regards > Amit > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 17:13 ` Amit kumar @ 2017-06-01 17:29 ` Andrew Fish 2017-06-01 17:37 ` Amit kumar 0 siblings, 1 reply; 8+ messages in thread From: Andrew Fish @ 2017-06-01 17:29 UTC (permalink / raw) To: Amit kumar; +Cc: edk2-devel@lists.01.org > On Jun 1, 2017, at 10:13 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Hello Andrew, > > As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. > But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. > Is this not a problem ? > Amit, I agree it looks like the code will fill in the Interface and return EFI_ALREADY_STARTED. And that does seem to conflict with the section of the spec you quote. Good catch. https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097 // // This is the protocol interface entry for this protocol // if (Attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { *Interface = Prot->Interface; } Status = EFI_SUCCESS; ByDriver = FALSE; Exclusive = FALSE; for ( Link = Prot->OpenList.ForwardLink; Link != &Prot->OpenList; Link = Link->ForwardLink) { OpenData = CR (Link, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE); ExactMatch = (BOOLEAN)((OpenData->AgentHandle == ImageHandle) && (OpenData->Attributes == Attributes) && (OpenData->ControllerHandle == ControllerHandle)); if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { ByDriver = TRUE; if (ExactMatch) { Status = EFI_ALREADY_STARTED; goto Done; } } if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) != 0) { Exclusive = TRUE; } else if (ExactMatch) { OpenData->OpenCount++; Status = EFI_SUCCESS; goto Done; } } Thanks, Andrew Fish > Status = gBS->OpenProtocol ( > Controller, > &gEfiPciIoProtocolGuid, > (VOID **) &PciIo, > This->DriverBindingHandle, > Controller, > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > > ________________________________ > From: afish@apple.com <afish@apple.com> on behalf of Andrew Fish <afish@apple.com> > Sent: Thursday, June 1, 2017 10:28:16 PM > To: Amit kumar > Cc: edk2-devel@lists.01.org > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > >> On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com> wrote: >> >> Hi, >> I am trying to open PciIoProtocol and facing some issue. >> >> below is the code >> >> EFI_PCI_IO_PROTOCOL *PciIo=NULL; >> EFI_STATUS Status; >> >> Status = gBS->OpenProtocol ( >> Controller, >> &gEfiPciIoProtocolGuid, >> (VOID **) &PciIo, >> This->DriverBindingHandle, >> Controller, >> EFI_OPEN_PROTOCOL_BY_DRIVER >> ); >> >> it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. >> Is it not supposed to return PciIo as NULL ? >> As per UEFI 2.6 Spec Section 6.3 page 182. >> > > Amit, > > Look at the Status Codes Returned section at the end of that section. > > Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. > > Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. > > Thanks, > > Andrew Fish > >> There are a number of reasons that this function call can return an error. If an error is returned, then >> AgentHandle, ControllerHandle, and Attributes are not added to the list of agents >> consuming the protocol interface specified by Handle and Protocol, and Interface is >> returned unmodified. >> >> Thanks And Regards >> Amit >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.01.org >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 17:29 ` Andrew Fish @ 2017-06-01 17:37 ` Amit kumar 2017-06-01 17:38 ` Andrew Fish 0 siblings, 1 reply; 8+ messages in thread From: Amit kumar @ 2017-06-01 17:37 UTC (permalink / raw) To: Andrew Fish; +Cc: edk2-devel@lists.01.org Hello Andrew, Thanks for quick reply and acknowledging my query. Amit ________________________________ From: afish@apple.com <afish@apple.com> on behalf of Andrew Fish <afish@apple.com> Sent: Thursday, June 1, 2017 10:59:03 PM To: Amit kumar Cc: edk2-devel@lists.01.org Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > On Jun 1, 2017, at 10:13 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Hello Andrew, > > As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. > But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. > Is this not a problem ? > Amit, I agree it looks like the code will fill in the Interface and return EFI_ALREADY_STARTED. And that does seem to conflict with the section of the spec you quote. Good catch. https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097 // // This is the protocol interface entry for this protocol // if (Attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { *Interface = Prot->Interface; } Status = EFI_SUCCESS; ByDriver = FALSE; Exclusive = FALSE; for ( Link = Prot->OpenList.ForwardLink; Link != &Prot->OpenList; Link = Link->ForwardLink) { OpenData = CR (Link, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE); ExactMatch = (BOOLEAN)((OpenData->AgentHandle == ImageHandle) && (OpenData->Attributes == Attributes) && (OpenData->ControllerHandle == ControllerHandle)); if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { ByDriver = TRUE; if (ExactMatch) { Status = EFI_ALREADY_STARTED; goto Done; } } if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) != 0) { Exclusive = TRUE; } else if (ExactMatch) { OpenData->OpenCount++; Status = EFI_SUCCESS; goto Done; } } Thanks, Andrew Fish > Status = gBS->OpenProtocol ( > Controller, > &gEfiPciIoProtocolGuid, > (VOID **) &PciIo, > This->DriverBindingHandle, > Controller, > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > > ________________________________ > From: afish@apple.com <afish@apple.com> on behalf of Andrew Fish <afish@apple.com> > Sent: Thursday, June 1, 2017 10:28:16 PM > To: Amit kumar > Cc: edk2-devel@lists.01.org > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > >> On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com> wrote: >> >> Hi, >> I am trying to open PciIoProtocol and facing some issue. >> >> below is the code >> >> EFI_PCI_IO_PROTOCOL *PciIo=NULL; >> EFI_STATUS Status; >> >> Status = gBS->OpenProtocol ( >> Controller, >> &gEfiPciIoProtocolGuid, >> (VOID **) &PciIo, >> This->DriverBindingHandle, >> Controller, >> EFI_OPEN_PROTOCOL_BY_DRIVER >> ); >> >> it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. >> Is it not supposed to return PciIo as NULL ? >> As per UEFI 2.6 Spec Section 6.3 page 182. >> > > Amit, > > Look at the Status Codes Returned section at the end of that section. > > Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. > > Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. > > Thanks, > > Andrew Fish > >> There are a number of reasons that this function call can return an error. If an error is returned, then >> AgentHandle, ControllerHandle, and Attributes are not added to the list of agents >> consuming the protocol interface specified by Handle and Protocol, and Interface is >> returned unmodified. >> >> Thanks And Regards >> Amit >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.01.org >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 17:37 ` Amit kumar @ 2017-06-01 17:38 ` Andrew Fish 2017-06-01 17:40 ` Amit kumar 0 siblings, 1 reply; 8+ messages in thread From: Andrew Fish @ 2017-06-01 17:38 UTC (permalink / raw) To: Amit kumar; +Cc: edk2-devel@lists.01.org > On Jun 1, 2017, at 10:37 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Hello Andrew, > > Thanks for quick reply and acknowledging my query. > Please file a bugzilla against the code. Thanks, Andrew Fish > Amit > From: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com <mailto:afish@apple.com>> > Sent: Thursday, June 1, 2017 10:59:03 PM > To: Amit kumar > Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > > > On Jun 1, 2017, at 10:13 AM, Amit kumar <akamit91@hotmail.com <mailto:akamit91@hotmail.com>> wrote: > > > > Hello Andrew, > > > > As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. > > But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. > > Is this not a problem ? > > > > Amit, > > I agree it looks like the code will fill in the Interface and return EFI_ALREADY_STARTED. And that does seem to conflict with the section of the spec you quote. Good catch. > > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097 <https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097> > // > // This is the protocol interface entry for this protocol > // > if (Attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { > *Interface = Prot->Interface; > } > Status = EFI_SUCCESS; > > ByDriver = FALSE; > Exclusive = FALSE; > for ( Link = Prot->OpenList.ForwardLink; Link != &Prot->OpenList; Link = Link->ForwardLink) { > OpenData = CR (Link, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE); > ExactMatch = (BOOLEAN)((OpenData->AgentHandle == ImageHandle) && > (OpenData->Attributes == Attributes) && > (OpenData->ControllerHandle == ControllerHandle)); > if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { > ByDriver = TRUE; > if (ExactMatch) { > Status = EFI_ALREADY_STARTED; > goto Done; > } > } > if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) != 0) { > Exclusive = TRUE; > } else if (ExactMatch) { > OpenData->OpenCount++; > Status = EFI_SUCCESS; > goto Done; > } > } > > Thanks, > > Andrew Fish > > > Status = gBS->OpenProtocol ( > > Controller, > > &gEfiPciIoProtocolGuid, > > (VOID **) &PciIo, > > This->DriverBindingHandle, > > Controller, > > EFI_OPEN_PROTOCOL_BY_DRIVER > > ); > > > > ________________________________ > > From: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com <mailto:afish@apple.com>> > > Sent: Thursday, June 1, 2017 10:28:16 PM > > To: Amit kumar > > Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > > > > >> On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com <mailto:akamit91@hotmail.com>> wrote: > >> > >> Hi, > >> I am trying to open PciIoProtocol and facing some issue. > >> > >> below is the code > >> > >> EFI_PCI_IO_PROTOCOL *PciIo=NULL; > >> EFI_STATUS Status; > >> > >> Status = gBS->OpenProtocol ( > >> Controller, > >> &gEfiPciIoProtocolGuid, > >> (VOID **) &PciIo, > >> This->DriverBindingHandle, > >> Controller, > >> EFI_OPEN_PROTOCOL_BY_DRIVER > >> ); > >> > >> it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. > >> Is it not supposed to return PciIo as NULL ? > >> As per UEFI 2.6 Spec Section 6.3 page 182. > >> > > > > Amit, > > > > Look at the Status Codes Returned section at the end of that section. > > > > Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. > > > > Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. > > > > Thanks, > > > > Andrew Fish > > > >> There are a number of reasons that this function call can return an error. If an error is returned, then > >> AgentHandle, ControllerHandle, and Attributes are not added to the list of agents > >> consuming the protocol interface specified by Handle and Protocol, and Interface is > >> returned unmodified. > >> > >> Thanks And Regards > >> Amit > >> _______________________________________________ > >> edk2-devel mailing list > >> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > >> https://lists.01.org/mailman/listinfo/edk2-devel <https://lists.01.org/mailman/listinfo/edk2-devel> > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > > https://lists.01.org/mailman/listinfo/edk2-devel <https://lists.01.org/mailman/listinfo/edk2-devel> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 17:38 ` Andrew Fish @ 2017-06-01 17:40 ` Amit kumar 2017-06-01 17:41 ` Andrew Fish 0 siblings, 1 reply; 8+ messages in thread From: Amit kumar @ 2017-06-01 17:40 UTC (permalink / raw) To: Andrew Fish; +Cc: edk2-devel@lists.01.org Certainly i will do that. Meanwhile can i submit the patch too ? Amit ________________________________ From: afish@apple.com <afish@apple.com> on behalf of Andrew Fish <afish@apple.com> Sent: Thursday, June 1, 2017 11:08:59 PM To: Amit kumar Cc: edk2-devel@lists.01.org Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() On Jun 1, 2017, at 10:37 AM, Amit kumar <akamit91@hotmail.com<mailto:akamit91@hotmail.com>> wrote: Hello Andrew, Thanks for quick reply and acknowledging my query. Please file a bugzilla against the code. Thanks, Andrew Fish Amit ________________________________ From: afish@apple.com<mailto:afish@apple.com> <afish@apple.com<mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com<mailto:afish@apple.com>> Sent: Thursday, June 1, 2017 10:59:03 PM To: Amit kumar Cc: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > On Jun 1, 2017, at 10:13 AM, Amit kumar <akamit91@hotmail.com<mailto:akamit91@hotmail.com>> wrote: > > Hello Andrew, > > As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. > But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. > Is this not a problem ? > Amit, I agree it looks like the code will fill in the Interface and return EFI_ALREADY_STARTED. And that does seem to conflict with the section of the spec you quote. Good catch. https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097 // // This is the protocol interface entry for this protocol // if (Attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { *Interface = Prot->Interface; } Status = EFI_SUCCESS; ByDriver = FALSE; Exclusive = FALSE; for ( Link = Prot->OpenList.ForwardLink; Link != &Prot->OpenList; Link = Link->ForwardLink) { OpenData = CR (Link, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE); ExactMatch = (BOOLEAN)((OpenData->AgentHandle == ImageHandle) && (OpenData->Attributes == Attributes) && (OpenData->ControllerHandle == ControllerHandle)); if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { ByDriver = TRUE; if (ExactMatch) { Status = EFI_ALREADY_STARTED; goto Done; } } if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) != 0) { Exclusive = TRUE; } else if (ExactMatch) { OpenData->OpenCount++; Status = EFI_SUCCESS; goto Done; } } Thanks, Andrew Fish > Status = gBS->OpenProtocol ( > Controller, > &gEfiPciIoProtocolGuid, > (VOID **) &PciIo, > This->DriverBindingHandle, > Controller, > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > > ________________________________ > From: afish@apple.com<mailto:afish@apple.com> <afish@apple.com<mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com<mailto:afish@apple.com>> > Sent: Thursday, June 1, 2017 10:28:16 PM > To: Amit kumar > Cc: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > >> On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com<mailto:akamit91@hotmail.com>> wrote: >> >> Hi, >> I am trying to open PciIoProtocol and facing some issue. >> >> below is the code >> >> EFI_PCI_IO_PROTOCOL *PciIo=NULL; >> EFI_STATUS Status; >> >> Status = gBS->OpenProtocol ( >> Controller, >> &gEfiPciIoProtocolGuid, >> (VOID **) &PciIo, >> This->DriverBindingHandle, >> Controller, >> EFI_OPEN_PROTOCOL_BY_DRIVER >> ); >> >> it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. >> Is it not supposed to return PciIo as NULL ? >> As per UEFI 2.6 Spec Section 6.3 page 182. >> > > Amit, > > Look at the Status Codes Returned section at the end of that section. > > Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. > > Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. > > Thanks, > > Andrew Fish > >> There are a number of reasons that this function call can return an error. If an error is returned, then >> AgentHandle, ControllerHandle, and Attributes are not added to the list of agents >> consuming the protocol interface specified by Handle and Protocol, and Interface is >> returned unmodified. >> >> Thanks And Regards >> Amit >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Problem in EFI_BOOT_SERVICES.OpenProtocol() 2017-06-01 17:40 ` Amit kumar @ 2017-06-01 17:41 ` Andrew Fish 0 siblings, 0 replies; 8+ messages in thread From: Andrew Fish @ 2017-06-01 17:41 UTC (permalink / raw) To: Amit kumar; +Cc: edk2-devel@lists.01.org > On Jun 1, 2017, at 10:40 AM, Amit kumar <akamit91@hotmail.com> wrote: > > Certainly i will do that. > Meanwhile can i submit the patch too ? Yes as long as you follow the process. Thanks, Andrew Fish > Amit > From: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com <mailto:afish@apple.com>> > Sent: Thursday, June 1, 2017 11:08:59 PM > To: Amit kumar > Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() > > >> On Jun 1, 2017, at 10:37 AM, Amit kumar <akamit91@hotmail.com <mailto:akamit91@hotmail.com>> wrote: >> >> Hello Andrew, >> >> Thanks for quick reply and acknowledging my query. >> > > Please file a bugzilla against the code. > > Thanks, > > Andrew Fish > >> Amit >> From: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com <mailto:afish@apple.com>> >> Sent: Thursday, June 1, 2017 10:59:03 PM >> To: Amit kumar >> Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> >> Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() >> >> >> > On Jun 1, 2017, at 10:13 AM, Amit kumar <akamit91@hotmail.com <mailto:akamit91@hotmail.com>> wrote: >> > >> > Hello Andrew, >> > >> > As per UEFI Spec EFI_ALREADY_STARTED is treated as error code, thus PciIo (The Interface 3rd parameter ) should remain NULL. >> > But after OpenProtocol call even though Status = EFI_ALREADY_STARTED PciIo (The Interface 3rd parameter ) is getting modified and it not NULL anymore. >> > Is this not a problem ? >> > >> >> Amit, >> >> I agree it looks like the code will fill in the Interface and return EFI_ALREADY_STARTED. And that does seem to conflict with the section of the spec you quote. Good catch. >> >> https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097 <https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Hand/Handle.c#L1097> >> // >> // This is the protocol interface entry for this protocol >> // >> if (Attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { >> *Interface = Prot->Interface; >> } >> Status = EFI_SUCCESS; >> >> ByDriver = FALSE; >> Exclusive = FALSE; >> for ( Link = Prot->OpenList.ForwardLink; Link != &Prot->OpenList; Link = Link->ForwardLink) { >> OpenData = CR (Link, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE); >> ExactMatch = (BOOLEAN)((OpenData->AgentHandle == ImageHandle) && >> (OpenData->Attributes == Attributes) && >> (OpenData->ControllerHandle == ControllerHandle)); >> if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { >> ByDriver = TRUE; >> if (ExactMatch) { >> Status = EFI_ALREADY_STARTED; >> goto Done; >> } >> } >> if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) != 0) { >> Exclusive = TRUE; >> } else if (ExactMatch) { >> OpenData->OpenCount++; >> Status = EFI_SUCCESS; >> goto Done; >> } >> } >> >> Thanks, >> >> Andrew Fish >> >> > Status = gBS->OpenProtocol ( >> > Controller, >> > &gEfiPciIoProtocolGuid, >> > (VOID **) &PciIo, >> > This->DriverBindingHandle, >> > Controller, >> > EFI_OPEN_PROTOCOL_BY_DRIVER >> > ); >> > >> > ________________________________ >> > From: afish@apple.com <mailto:afish@apple.com> <afish@apple.com <mailto:afish@apple.com>> on behalf of Andrew Fish <afish@apple.com <mailto:afish@apple.com>> >> > Sent: Thursday, June 1, 2017 10:28:16 PM >> > To: Amit kumar >> > Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> >> > Subject: Re: [edk2] Problem in EFI_BOOT_SERVICES.OpenProtocol() >> > >> > >> >> On Jun 1, 2017, at 9:46 AM, Amit kumar <akamit91@hotmail.com <mailto:akamit91@hotmail.com>> wrote: >> >> >> >> Hi, >> >> I am trying to open PciIoProtocol and facing some issue. >> >> >> >> below is the code >> >> >> >> EFI_PCI_IO_PROTOCOL *PciIo=NULL; >> >> EFI_STATUS Status; >> >> >> >> Status = gBS->OpenProtocol ( >> >> Controller, >> >> &gEfiPciIoProtocolGuid, >> >> (VOID **) &PciIo, >> >> This->DriverBindingHandle, >> >> Controller, >> >> EFI_OPEN_PROTOCOL_BY_DRIVER >> >> ); >> >> >> >> it returns Status = EFI_ALREADY_STARTED, but PciIo is not NULL. >> >> Is it not supposed to return PciIo as NULL ? >> >> As per UEFI 2.6 Spec Section 6.3 page 182. >> >> >> > >> > Amit, >> > >> > Look at the Status Codes Returned section at the end of that section. >> > >> > Attributes is BY_DRIVER and there is an item on the open list with an attribute of BY_DRIVER whose agent handle is the same as AgentHandle. >> > >> > Attributes is BY_DRIVER|EXCLUSIVE and there is an item on the open list with an attribute of BY_DRIVER|EXCLUSIVE whose agent handle is the same as AgentHandle. >> > >> > Thanks, >> > >> > Andrew Fish >> > >> >> There are a number of reasons that this function call can return an error. If an error is returned, then >> >> AgentHandle, ControllerHandle, and Attributes are not added to the list of agents >> >> consuming the protocol interface specified by Handle and Protocol, and Interface is >> >> returned unmodified. >> >> >> >> Thanks And Regards >> >> Amit >> >> _______________________________________________ >> >> edk2-devel mailing list >> >> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> >> >> https://lists.01.org/mailman/listinfo/edk2-devel <https://lists.01.org/mailman/listinfo/edk2-devel> >> > >> > _______________________________________________ >> > edk2-devel mailing list >> > edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> >> > https://lists.01.org/mailman/listinfo/edk2-devel <https://lists.01.org/mailman/listinfo/edk2-devel> ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-06-01 17:40 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-06-01 16:46 Problem in EFI_BOOT_SERVICES.OpenProtocol() Amit kumar 2017-06-01 16:58 ` Andrew Fish 2017-06-01 17:13 ` Amit kumar 2017-06-01 17:29 ` Andrew Fish 2017-06-01 17:37 ` Amit kumar 2017-06-01 17:38 ` Andrew Fish 2017-06-01 17:40 ` Amit kumar 2017-06-01 17:41 ` Andrew Fish
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox