diff mbox

[edk2] BUG in properties table feature implementation

Message ID CAKv+Gu9wEcOBWATjz4pFJ+WGAz9asy8LHK+OUz2b2MW0=ALFgQ@mail.gmail.com
State New
Headers show

Commit Message

Ard Biesheuvel June 29, 2015, 6:10 p.m. UTC
On 29 June 2015 at 17:12, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 29 June 2015 at 17:09, Matt Fleming <matt@codeblueprint.co.uk> wrote:
>> On Mon, 29 Jun, at 03:06:32PM, Laszlo Ersek wrote:
>>>
>>> In any case, for OVMF, I think we'll need a small patch that disables
>>> this feature (if for nothing else, then to quell the noisy warnings
>>> about "the section alignment being != 4 KB"). I'm adding that to my
>>> queue (but anyone please feel free to do it while I'm offline).
>>
>> Is there any chance that we could wire up support in OVMF? What work is
>> required to support it?
>>
>
> I think it would be fairly easy, actually, once Laszlo manages to
> untangle the S3Save mess so that OVMF signals EndOfDxe correctly.
> Then, it is mainly a matter of using the new build script that emits 4
> KB aligned segments for .text and .data
>

This seems to do the job nicely:

----------8<------------
----------8<------------

$ readelf -S Build/OvmfX64/DEBUG_GCC48/X64/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb/DEBUG/EmuVariableFvbRuntimeDxe.dll

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
...
  [ 1] .text             PROGBITS         0000000000001000  00001000
       0000000000004780  0000000000000000  AX       0     0     4096
...
  [ 3] .data             PROGBITS         0000000000006000  00006000
       0000000000002740  0000000000000000  WA       0     0     4096
...


With Laszlo's 9 piece series applied to ensure that end of DXE gets
signalled, UEFI seems to do the right thing here. Here's a snippet of
my boot log (x86_64)

[    0.000000] efi: mem22: type=6, attr=0x800000000000400f,
range=[0x0000000006daa000-0x0000000006db1000) (0MB)
[    0.000000] efi: mem23: type=5, attr=0x800000000002000f,
range=[0x0000000006db1000-0x0000000006db6000) (0MB)
[    0.000000] efi: mem24: type=6, attr=0x800000000000400f,
range=[0x0000000006db6000-0x0000000006dc0000) (0MB)
[    0.000000] efi: mem25: type=6, attr=0x800000000000400f,
range=[0x0000000006dc0000-0x0000000006dc1000) (0MB)
[    0.000000] efi: mem26: type=5, attr=0x800000000002000f,
range=[0x0000000006dc1000-0x0000000006dc5000) (0MB)
[    0.000000] efi: mem27: type=6, attr=0x800000000000400f,
range=[0x0000000006dc5000-0x0000000006dce000) (0MB)
[    0.000000] efi: mem28: type=6, attr=0x800000000000400f,
range=[0x0000000006dce000-0x0000000006dcf000) (0MB)
[    0.000000] efi: mem29: type=5, attr=0x800000000002000f,
range=[0x0000000006dcf000-0x0000000006dd5000) (0MB)
[    0.000000] efi: mem30: type=6, attr=0x800000000000400f,
range=[0x0000000006dd5000-0x0000000006e02000) (0MB)
[    0.000000] efi: mem31: type=6, attr=0x800000000000400f,
range=[0x0000000006e02000-0x0000000006e03000) (0MB)
[    0.000000] efi: mem32: type=5, attr=0x800000000002000f,
range=[0x0000000006e03000-0x0000000006e12000) (0MB)
[    0.000000] efi: mem33: type=6, attr=0x800000000000400f,
range=[0x0000000006e12000-0x0000000006e1a000) (0MB)

so code and data regions are correctly marked as RO and XP, respectively.

However, further down I get

[    0.034428] BUG: unable to handle kernel paging request at fffffffefe60d64d
[    0.036000] IP: [<fffffffefe60d64d>] 0xfffffffefe60d64d
[    0.036000] PGD 4c11067 PUD 601b063 PMD 6028063 PTE 0
[    0.036000] Oops: 0010 [#1] SMP
[    0.036000] Modules linked in:
[    0.036000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.13.0-55-generic #94-Ubuntu
[    0.036000] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
BIOS 0.0.0 02/06/2015
[    0.036000] task: ffffffff81c15480 ti: ffffffff81c00000 task.ti:
ffffffff81c00000
[    0.036000] RIP: 0010:[<fffffffefe60d64d>]  [<fffffffefe60d64d>]
0xfffffffefe60d64d
[    0.036000] RSP: 0000:ffffffff81c01d48  EFLAGS: 00000202
[    0.036000] RAX: fffffffefe60d64d RBX: ffffffffffffffff RCX: ffffffff81c396e0
[    0.036000] RDX: ffffffff81c01f00 RSI: ffffffff81c396e0 RDI: fffffffefe40a957
[    0.036000] RBP: ffffffff81c01e00 R08: 0000000000000007 R09: 0000000000000000
[    0.036000] R10: ffffea0000180e00 R11: ffffffff81d51ce0 R12: ffffffff81c01f00
[    0.036000] R13: 0000000000000000 R14: 0000000000000007 R15: 000000000009c000
[    0.036000] FS:  0000000000000000(0000) GS:ffff880006600000(0000)
knlGS:0000000000000000
[    0.036000] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    0.036000] CR2: fffffffefe60d64d CR3: 000000000009c000 CR4: 00000000000006b0
[    0.036000] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    0.036000] DR3: 0000000000000000 DR6: 0000000000000000 DR7: 0000000000000000
[    0.036000] Stack:
[    0.036000]  fffffffefe40aa08 ffffffff81c01da0 0000000007eb3893
0000000006db7000
[    0.036000]  0000000006db7000 0000000006dba000 0000000007eed090
0000000000000078
[    0.036000]  752ea16d07eede98 ffffffff81c01de0 0000000007eb3800
0000000007eed018
[    0.036000] Call Trace:
[    0.036000]  [<ffffffff810624f1>] efi_call5+0x71/0xf0
[    0.036000]  [<ffffffff81061879>] ? virt_efi_set_variable+0x49/0x60
[    0.036000]  [<ffffffff81d51d4c>] efi_enter_virtual_mode+0x2fe/0x332
[    0.036000]  [<ffffffff81d34edc>] start_kernel+0x3a4/0x443
[    0.036000]  [<ffffffff81d34941>] ? repair_env_string+0x5c/0x5c
[    0.036000]  [<ffffffff81d34120>] ? early_idt_handlers+0x120/0x120
[    0.036000]  [<ffffffff81d345ee>] x86_64_start_reservations+0x2a/0x2c
[    0.036000]  [<ffffffff81d34733>] x86_64_start_kernel+0x143/0x152
[    0.036000] Code:  Bad RIP value.
[    0.036000] RIP  [<fffffffefe60d64d>] 0xfffffffefe60d64d
[    0.036000]  RSP <ffffffff81c01d48>
[    0.036000] CR2: fffffffefe60d64d
[    0.036000] ---[ end trace acf85ef8d4475d7c ]---
diff mbox

Patch

diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index e5fc90d2e610..7f06b51f65cf 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -48,6 +48,9 @@  [BuildOptions]
   INTEL:*_*_X64_GENFW_FLAGS = --keepexceptiontable
 !endif

+[BuildOptions.X64.EDKII.DXE_RUNTIME_DRIVER]
+  GCC:*_*_*_DLINK_FLAGS =
--script=$(EDK_TOOLS_PATH)/Scripts/gcc-4K-align-ld-script
+
 ################################################################################
 #
 # SKU Identification section - list of all SKU IDs supported by this Platform.