On 2017-09-05 20:13:19, Song, Ge wrote: > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ge Song <[email protected]> >
Pushed as 89796c69d9fdaa9bd13d37b6b1687df5e0104ed5. Thanks for noticing that bug and fixing it! I also hope your IT might be to help you configure git send-email to make future contributions from your hxt-semitech.com email a bit easier. Thanks again! -Jordan > > -----Original Message----- > From: [email protected] [mailto:[email protected]] > Sent: 2017年9月6日 11:12 > To: [email protected] > Cc: Jordan Justen <[email protected]>; Laszlo Ersek > <[email protected]>; Ard Biesheuvel <[email protected]>; Song, Ge > <[email protected]> > Subject: [PATCH v3 1/1] OvmfPkg/SecMain: Fix stack switching to permanent > memory > > From: Ge Song <[email protected]> > > In earlier PEI stage, temporary memory at PcdOvmfSecPeiTempRamBase is > employed as stack and heap. We move them to the new room and do some > relocation fixup when permanent memory becomes available. > TemporaryRamMigration() is responsible for switching the stack. > > Before entering TemporaryRamMigration(), Ebp/Rbp is populated with the > content of Esp/Rsp and used as frame pointer. > > After the execution of SetJump/LongJump, stack migrates to new position > while the context keeps unchanged. > > But when TemporaryRamMigration() exits, Esp/Rsp is filled with > the content of Ebp/Rbp to destroy this stack frame. > > The result is, stack switches back to previous temporary memory. > > When permanent memory becomes available, modules that have registered > themselves for shadowing will be scheduled to execute. Some of them > need to consume more memory(heap/stack). Contrast to temporary stack, > permanent stack possesses larger space. > > The potential risk is overflowing the stack if stack staying in > temporary memory. When it happens, system may crash during S3 resume. > > More detailed information: > > (gdb) disassemble /r > > Dump of assembler code for function TemporaryRamMigration: > > 0x00000000fffcd29c <+0>:55push %rbp > > 0x00000000fffcd29d <+1>:48 89 e5mov %rsp,%rbp > > 0x00000000fffcd2a0 <+4>:48 81 ec 70 01 00 00sub > > $0x170,%rsp > > ... > > ... > > 0x00000000fffcd425 <+393>:e8 80 10 00 00callq 0xfffce4aa > > <SaveAndSetDebugTimerInterrupt> > > => 0x00000000fffcd42a <+398>:b8 00 00 00 00mov $0x0,%eax > > 0x00000000fffcd42f <+403>:c9leaveq > > 0x00000000fffcd430 <+404>:c3retq > > End of assembler dump. > > See the description of leave(opcode: c9), from > Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2A > > "Releases the stack frame set up by an earlier ENTER instruction. The > LEAVE instruction copies the frame pointer (in the EBP register) into > the stack pointer register (ESP), which releases the stack space > allocated to the stack frame. The old frame pointer (the frame pointer > for the calling procedure that was saved by the ENTER instruction) is > then popped from the stack into the EBP register, restoring the calling > procedure’s stack frame." > > To solve this, update Ebp/Rbp too when Esp/Rsp is updated > > Cc: Jordan Justen <[email protected]> > Cc: Laszlo Ersek <[email protected]> > Cc: Ard Biesheuvel <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ge Song <[email protected]> > Tested-by: Laszlo Ersek <[email protected]> > Reviewed-by: Laszlo Ersek <[email protected]> > --- > OvmfPkg/Sec/SecMain.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c > index e1993ec347b5..f7fec3d8c03b 100644 > --- a/OvmfPkg/Sec/SecMain.c > +++ b/OvmfPkg/Sec/SecMain.c > @@ -931,9 +931,11 @@ TemporaryRamMigration ( > if (SetJump (&JumpBuffer) == 0) { > #if defined (MDE_CPU_IA32) > JumpBuffer.Esp = JumpBuffer.Esp + DebugAgentContext.StackMigrateOffset; > + JumpBuffer.Ebp = JumpBuffer.Ebp + DebugAgentContext.StackMigrateOffset; > #endif > #if defined (MDE_CPU_X64) > JumpBuffer.Rsp = JumpBuffer.Rsp + DebugAgentContext.StackMigrateOffset; > + JumpBuffer.Rbp = JumpBuffer.Rbp + DebugAgentContext.StackMigrateOffset; > #endif > LongJump (&JumpBuffer, (UINTN)-1); > } > -- > 2.11.0 > > > > > This email is intended only for the named addressee. It may contain > information that is confidential/private, legally privileged, or > copyright-protected, and you should handle it accordingly. If you are not the > intended recipient, you do not have legal rights to retain, copy, or > distribute this email or its contents, and should promptly delete the email > and all electronic copies in your system; do not retain copies in any media. > If you have received this email in error, please notify the sender promptly. > Thank you. > > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

