[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

EFIVARS problem on i386 platform



Problem:

“modprobe efivars” hangs platform during install on an i386 EFI based system. Opening another tty session and killing the process allows the install to continue to completion, though Linux is unable to copy elilo.efi, elilo.conf, initrd.img, and vmlinuz to the EFI Partition and it cannot create the Boot Manager variables. Before the install reboots, I can manually mount the EFI Partition (mount /dev/sda1 /mnt) and copy the initrd.img and vmlinux files to the EFI Partition. I had to find elilo.efi and elilo.conf elsewhere and copy them to the EFI Partition manually.

 

Once the OS is loaded, attempting to “modprobe efivars” causes a Segmentation Fault.

 

Background:

I am a developer on an EFI BIOS based Intel Core 2 Duo platform (i386). We have completed our EFI portion of the BIOS that meets the EFI Spec. The code is based from the TianoCore.org code base.

The EFI System Table is believed accurate and does point to the ACPI, SMBIOS, and MP tables.

 

Looking at dmesg shows the following:

Linux version 2.6.18-04-686 (Debian 2.6.18.dfsg.1-12) (waldi@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Mon Mar 26 17:17:36 UTC 2007
EFI: Warning: EFI system table major version mismatch: got 2.00, expected 1.00
EFI: EFI v2.00 by TianoCore.org
ACPI=0xf0030 <6> SMBIOS=0xf0ec0 <6> MPS=0xf1080

Though there is a warning that it was expecting version 1.00, it does parse the table and find the SMBIOS, ACPI, and MP tables. Later on during dmesg is where it parses each of those tables (ACPI, SMBIOS, and MP) without error.

There is one error later:
Oops: efitime: can't read time status: 0x80000007

I suspect this is related to Linux not being able to make EFI Runtime calls.

 

I have looked at the source code for efivars and from the comments it appears to be using hard-coded addresses to find the EFI System Table. Our EFI System Table is not at that address. I suspect this is the reason for the hangs and faults.

 

I know when EFI launches elilo.efi, it passes the address of the EFI System Table into it. I assume it uses this address and finds the table and that the first few lines of dmesg come from either it or initrd.img.

Perhaps the issue is that as Linux continues the boot process, it loses the address of the EFI System Table by the time efivars wants to load, and unable to determine the address of the table, the programmer was forced to use hard-coded address based on the only example at the time, the IA64 Itanium.

 

I have an American Arium ITP and hardware and BIOS debugging experience, though I have never attempted to debug Linux.

 

I am trying to figure out how to debug this module and confirm that it uses hard-coded memory addresses for the EFI System table. Perhaps as a test I can then hard-code it to the address of my table, but ultimately this needs to be fixed such that the address is available to efivars when it needs it.

 

Thank you for any direction or help.

Charles Abdouch

 


Reply to: