From: "Michael Brown" <mcb30@ipxe.org>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>,
"Ni, Ray" <ray.ni@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>,
Laszlo Ersek <lersek@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [edk2-devel] [PATCH 2/2] MdeModulePkg/DxeCore: Fix stack overflow issue due to nested interrupts
Date: Thu, 29 Feb 2024 17:39:21 +0000 [thread overview]
Message-ID: <0102018df5f307dd-f8dad33b-e6d3-43dc-baa8-2ced62ecc21e-000000@eu-west-1.amazonses.com> (raw)
In-Reply-To: <CO1PR11MB4929CF207E2314767430B4E8D25F2@CO1PR11MB4929.namprd11.prod.outlook.com>
On 29/02/2024 16:43, Kinney, Michael D wrote:
> Hi Michael,
>
> Can you provide a pointer to the UEFI Spec statement this breaks?
II-9.7.1.3 RestoreTPL():
"When the DXE Foundation is notified that the EFI_CPU_ARCH_PROTOCOL has
been installed, then the full version of the Boot Service RestoreTPL()
can be made available. When an attempt is made to restore the TPL level
to level below EFI_TPL_HIGH_LEVEL, then the DXE Foundation should use
the services of the EFI_CPU_ARCH_PROTOCOL to enable interrupts."
I suspect this is sufficient to veto the proposed design, though we
could argue that the loosely worded "should" is technically not "must".
If we still want to proceed with this design, then I have several other
questions:
- How does the proposed patch react to an interrupt occurring
(illegally) at TPL_HIGH_LEVEL (as happens with some versions of
Windows)? As far as I can tell, it will result in mInterruptedTplMask
having bit 31 set but never cleared. What impact will this have?
- How does the proposed patch react to potentially mismatched
RaisedTPL()/RestoreTPL() calls (e.g. oldTpl = RaiseTPL(TPL_CALLBACK)
followed by RaiseTPL(TPL_NOTIFY) followed by a single RestoreTPL(oldTpl))?
I believe the proposed patch is attempting to establish a new invariant
as follows:
Once an interrupt has occured at a given TPL, then that *TPL* is
conceptually considered to be in an "interrupted" state. The *only*
thing that can clear this "interrupted" state from the TPL is to return
from the interrupt handler.
Note that this conceptual definition does not perfectly align with the
bit flags in mInterruptedTplMask, since those bits will necessarily be
set only some time after the interrupt occurs, and will have to be
cleared before returning from the interrupt. However, it is the
conceptual definition that is relevant to the invariant.
The new invariant is that no code may execute at an "interrupted" TPL
with interrupts enabled. It is legitimate for code to raise to a higher
TPL and to enable interrupts while there, and it is legitimate for code
to execute in an "interrupted" TPL with interrupts disabled, but it is
not legitimate for any code to reenable interrupts while still at an
"interrupted" TPL.
It would be good to call out this invariant explicitly, so that authors
of interrupt handlers are aware of the restrictions. It would also
clarify some of the logic (e.g. it provides the reason why interrupts
must be disabled before lowering gEfiCurrentTpl in CoreRestoreTpl()).
It's also generally easier to reason about a stated invariant than to
extrapolate from a list of complicated examples.
Thanks,
Michael
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116178): https://edk2.groups.io/g/devel/message/116178
Mute This Topic: https://groups.io/mt/104642317/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-02-29 17:39 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 13:02 [edk2-devel] [PATCH 0/2] Fix stack overflow issue due to nested interrupts Ni, Ray
2024-02-29 13:02 ` [edk2-devel] [PATCH 1/2] UefiCpuPkg/CpuDxe: Return correct interrupt state Ni, Ray
2024-02-29 13:02 ` [edk2-devel] [PATCH 2/2] MdeModulePkg/DxeCore: Fix stack overflow issue due to nested interrupts Ni, Ray
2024-02-29 13:23 ` Michael Brown
2024-02-29 16:43 ` Michael D Kinney
2024-02-29 17:39 ` Michael Brown [this message]
2024-02-29 19:09 ` Michael D Kinney
2024-02-29 19:41 ` Michael Brown
2024-02-29 17:39 ` Paolo Bonzini
2024-02-29 19:09 ` Michael D Kinney
2024-02-29 19:04 ` Paolo Bonzini
2024-02-29 19:16 ` Michael D Kinney
2024-02-29 20:08 ` Paolo Bonzini
2024-02-29 19:22 ` Michael Brown
2024-02-29 19:26 ` Michael D Kinney
2024-02-29 19:44 ` Michael Brown
2024-02-29 20:11 ` Paolo Bonzini
2024-03-01 0:14 ` Paolo Bonzini
2024-03-01 3:07 ` Ni, Ray
2024-03-01 8:37 ` Paolo Bonzini
2024-03-01 9:27 ` Michael Brown
2024-03-01 9:33 ` Paolo Bonzini
2024-03-01 11:10 ` Michael Brown
2024-03-01 12:09 ` Paolo Bonzini
2024-03-05 4:19 ` Ni, Ray
[not found] ` <17B9C3692B44139F.30946@groups.io>
2024-06-18 5:54 ` Ni, Ray
2024-03-01 8:44 ` Paolo Bonzini
2024-03-01 9:20 ` Ni, Ray
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0102018df5f307dd-f8dad33b-e6d3-43dc-baa8-2ced62ecc21e-000000@eu-west-1.amazonses.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox