From: Laszlo Ersek <lersek@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: michael.d.kinney@intel.com,
Jordan Justen <jordan.l.justen@intel.com>,
Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] target-i386: allow any alignment for SMBASE
Date: Mon, 12 Oct 2015 19:32:17 +0200 [thread overview]
Message-ID: <561BEEA1.5030500@redhat.com> (raw)
In-Reply-To: <1444667140-9449-1-git-send-email-pbonzini@redhat.com>
On 10/12/15 18:25, Paolo Bonzini wrote:
> Processors up to the Pentium (says Bochs---I do not have old enough
> manuals) require a 32KiB alignment for the SMBASE, but newer processors
> do not need that, and Tiano Core will use non-aligned SMBASE values.
The Quark package has the following comment & code:
//
// Allocate buffer for all of the tiles.
// For 486/Pentium, the SMBASE (and hence the buffer) must be aligned on a 32KB boundary
//
Buffer = AllocatePages (EFI_SIZE_TO_PAGES (SIZE_64KB + TileSize * (gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus - 1)));
Buffer = (VOID *)(((UINTN)Buffer & 0xFFFF8000) + SIZE_32KB);
whereas Mike's patch
<http://thread.gmane.org/gmane.comp.bios.edk2.devel/2707/focus=2714>
has:
// Allocate buffer for all of the tiles.
//
// Intel(R) 64 and IA-32 Architectures Software Developer's Manual
// Volume 3C, Section 34.11 SMBASE Relocation
// For 486(FamilyId:4)/Pentium(FamilyId:5), the SMBASE (and hence the buffer)
// must be aligned on a 32KB boundary
//
if ((FamilyId == 4) || (FamilyId == 5)) {
Buffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES (SIZE_32KB + TileSize * (mMaxNumberOfCpus - 1)), SIZE_32KB);
} else {
Buffer = AllocatePages (EFI_SIZE_TO_PAGES (SIZE_32KB + TileSize * (mMaxNumberOfCpus - 1)));
}
The most recent Intel SDM I have on my disk (the unified mammoth
edition) is "325462-054US, April 2015"; the section that Mike marked
above states the following (parentheses theirs):
(For Pentium and Intel486 processors, the SMBASE values must be
aligned on a 32-KByte boundary or the processor will enter shutdown
state during the execution of a RSM instruction.)
> Reported-by: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Laszlo Ersek <lersek@intel.com>
This is a typo, please fix it up as
Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> target-i386/smm_helper.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target-i386/smm_helper.c b/target-i386/smm_helper.c
> index 02e24b9..c272a98 100644
> --- a/target-i386/smm_helper.c
> +++ b/target-i386/smm_helper.c
> @@ -266,7 +266,7 @@ void helper_rsm(CPUX86State *env)
>
> val = x86_ldl_phys(cs, sm_state + 0x7efc); /* revision ID */
> if (val & 0x20000) {
> - env->smbase = x86_ldl_phys(cs, sm_state + 0x7f00) & ~0x7fff;
> + env->smbase = x86_ldl_phys(cs, sm_state + 0x7f00);
> }
This is under #ifdef TARGET_X86_64, so I guess it's right to remove the
masking unconditionally -- I think that because I believe the
intersection of TARGET_X86_64 and (FamilyId == 4 || FamilyId == 5)
should be empty. (In particular, the save state area in this branch is
laid out according to the AMD definition, not the Intel one, so the
Intel SDM is not normative here anyway.)
> #else
> cpu_x86_update_cr0(env, x86_ldl_phys(cs, sm_state + 0x7ffc));
> @@ -319,7 +319,7 @@ void helper_rsm(CPUX86State *env)
>
> val = x86_ldl_phys(cs, sm_state + 0x7efc); /* revision ID */
> if (val & 0x20000) {
> - env->smbase = x86_ldl_phys(cs, sm_state + 0x7ef8) & ~0x7fff;
> + env->smbase = x86_ldl_phys(cs, sm_state + 0x7ef8);
> }
> #endif
> if ((env->hflags2 & HF2_SMM_INSIDE_NMI_MASK) == 0) {
>
I first thought it would be better to keep the mask for (FamilyId == 4
|| FamilyId == 5). But, since we don't "enter shutdown state" even if
the alignment is incorrect (i.e., we don't emulate the letter of the SDM
for incorrect guest code anyway), and the patch retains behavior for
correct guest code, I think this branch should be fine as well.
With the typo fix in the Cc tag:
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Thank you
Laszlo
next prev parent reply other threads:[~2015-10-12 17:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-12 16:25 [Qemu-devel] [PATCH] target-i386: allow any alignment for SMBASE Paolo Bonzini
2015-10-12 17:32 ` Laszlo Ersek [this message]
2015-10-13 19:30 ` Eduardo Habkost
2015-10-13 19:42 ` Paolo Bonzini
2015-10-13 19:45 ` Eduardo Habkost
2015-10-23 14:40 ` Laszlo Ersek
2015-10-23 18:19 ` Eduardo Habkost
2015-10-23 21:27 ` Laszlo Ersek
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-all 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=561BEEA1.5030500@redhat.com \
--to=lersek@redhat.com \
--cc=ehabkost@redhat.com \
--cc=jordan.l.justen@intel.com \
--cc=michael.d.kinney@intel.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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;
as well as URLs for NNTP newsgroup(s).