On 28 March 2014 20:08, Michael Casadevall
<michael.casadev...@linaro.org> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
>
> On 03/28/2014 03:47 PM, Christoffer Dall wrote:
>> On Fri, Mar 28, 2014 at 03:38:28PM -0400, Michael Casadevall
>> wrote:
>>> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
>>>
>>>
>>>
>>> On 03/28/2014 02:09 PM, Christoffer Dall wrote:
>>>> On Fri, Mar 28, 2014 at 04:26:59AM -0400, Michael Casadevall
>>>> wrote:
>>>>> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
>>>>>
>>>>> As I've made a fair bit of headway since LinaroConnect, I
>>>>> wanted to drop a line on my current progress with porting
>>>>> TianoCore to KVM
>>>>>
>>>>> Summary (tl;dr version):
>>>>>
>>>>> KVM can start TianoCore, and boot all the way to shell, and
>>>>> access HDDs via VirtioBlk. We can start grub and
>>>>> successfully retrieve files from ext partitions, load a
>>>>> device tree, and start the kernel. The kernel runs through
>>>>> most of the EFI stub, but falls over during
>>>>> ExitBootServices()
>>>>
>>>> Thanks for providing this status!
>>>>
>>>>>
>>>>> Long Version:
>>>>>
>>>>> So, after much blood sweat and tears, we're finally at the
>>>>> point of trying to actually start a kernel, though this (for
>>>>> the moment) remains an elusive goal. The current problem is
>>>>> that once we call EBS(), we get an exception from EFI with no
>>>>> Image information, which means the exception handler doesn't
>>>>> know where it came from. After several seconds, we get a
>>>>> second exception from within DxeCore, and then EFI falls
>>>>> over.
>>>>>
>>>>> Debugging EFI is difficult and error prone, combined with
>>>>> limited debug facilities from the gdb-stub in QEMU (no
>>>>> breakpoints), and no decent way to load all of EFI itself
>>>>> (you have to run add-symbol-file manually with the output of
>>>>> commands printed on the console; supposedly its possible to
>>>>> generate a giant GdbSyms.dll file to import in a single go,
>>>>> but I haven't succeeded at this). This is further complicated
>>>>> that it appears we're asserting somewhere in a driver, and
>>>>> short of adding printfs to *every* driver, its impossible to
>>>>> know which is asseting.
>>>>
>>>> Maybe it's worth adding a hack-support-gdb-in-kvm
>>>> implementation for this.  If we go down this road, I can
>>>> probably find time to help you out there.
>>>>
>>>> Can you do some scripting to replace assert statements with "{
>>>>  print("%s:%d\n", __FILE__, __LINE__); orig_assert(); }" type
>>>> hack?
>>>>
>>>
>>> That's probably a decent idea if I can find where ASSERT() is
>>> defined. I'll try that in a bit.
>>>
>>>>>
>>>>> Previous attempts to debug assets shows that EFI does "odd"
>>>>> things to the stack when we hit an exception, making walking
>>>>> it with GDB impossible. I need to figure out what madness EFI
>>>>> does with my SP so I can get the entire stack on an
>>>>> explosion, but this remains at best hopeful thinking.
>>>>
>>>> This sounds very strange - could it be that because you take an
>>>>  exception, you use a SP from a different mode and everything
>>>> just messes up?
>>>>
>>>
>>> This could be GDB just being unhappy. I've had issues walking
>>> the stack in KVM in general, but even if I walk the stack by
>>> hand, I don't see a pointer to the next frame when we're in an
>>> exception. To my knowledge, UEFI uses the standard AArch64 C ABI,
>>> but this might be a faulty exception on my part.
>>>
>>>>>
>>>>> Further complicating things is that during EBS, my print
>>>>> debugging goes away. I might just cheat and roll a simple
>>>>> assembly function to bang out messages through serial
>>>>> without calling anything else. Ugly as sin, but this should
>>>>> let me get useful debug output through the EBS framework.
>>>>> Complicating matters is that I need to locate each and all
>>>>> EBS() event functions, which are spread *everywhere* in
>>>>> TianoCore, and then debug them each individually.
>>>>
>>>> I'm a little confused no knowing UEFI, is EBS() not a single
>>>> function and what does it matter that it's called from
>>>> multiple places?
>>>>
>>>
>>> So, drivers and applications can enlist to get notification of
>>> when ExitBootServices are called. This pushes a pointer to a
>>> function into an array when is then iterated through and this
>>> pointer is then called so drivers can unregister themselves from
>>> boot services, etc.
>>>
>>> Complicating the issue is I can't use printf once GetMemoryMap()
>>> is called without breaking EBS() (I think this is a bug in UEFI,
>>> leif, 2 cents?, but I think I can twiddle the serial port
>>> directly without breaking shit.
>>
>> yeah, just writing to the pl011 out should be trivial, or add an
>> hvc temporary hack to KVM, I've done things like that when
>> originally debugging kernel boot under KVM.
>>
>
> Just for the record, hvc?
>
>>>
>>> Having slept on it, its probably easy to print out the pointers
>>> as we go through them, so I can get an idea of whats listening
>>> for EBS and try and narrow down my list of candidates.
>>>
>>
>> yes, add a function that side-steps all the UEFI-weirdness (should
>> be a few lines static function) that can print the pointers of the
>> functions you're calling.
>>
>
> Biggest issue is now binutils doesn't like PE?AArch64 files (addr2line
> and friends don't work) but I think I can muddle through it. There are
> tricks at this point I can use if I have a pointer to get an idea
> where UEFI is.

If you could create a bug in the sourceware bugzilla for this issue
then I'll add it to my list of things to fix.

Cheers,

-- 
Will Newton
Toolchain Working Group, Linaro

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to