-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


On 03/28/2014 05:02 PM, Christoffer Dall wrote:
> On Fri, Mar 28, 2014 at 04:08:52PM -0400, Michael Casadevall
> 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?
>> 
> 
> Hypervisor Call, 'HVC' is the instruction that causes a trap to
> KVM, so you could do "mov r1, #0x41; mov r0, #0xff42; hvc #0;" to
> invent a hypercall on number 0xff42 meaning "do print somewhere"
> and print 'A'. That would be useful if you don't know what your
> memory map is like and have no idea if you can even get to your
> pl011 registers, but if know the address of that, it may be much
> easier to just hardcode that.
> 
>>>> 
>>>> 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.
>> 
>>>>>> 
>>>>>> I'm open to ideas on how best to accomplish this.
>>>>>> 
>>>>>> On a larger scale, there are a couple of other bugs and
>>>>>> odds and ends which currently affect us:
>>>>>> 
>>>>>> * wfi doesn't work
>>>>>> 
>>>>>> THis is probably the biggest w.r.t. to functionality
>>>>>> that should work, but doesn't. The EFI event loop is
>>>>>> built on checking the timer, then calling wfi to check
>>>>>> the timer later. The problem here is we call wfi ... and
>>>>>> UEFI never comes back despite events firing (I can put
>>>>>> print code in the interrupt handler to confirm this).
>>>>>> This may be related to the VGIC errors I get running kvm
>>>>>> under foundation, but haven't taken the time to properly
>>>>>> nail down the bug here.
>>>>> 
>>>>> So if I understand it, the expected sequence of events
>>>>> are:
>>>>> 
>>>>> 1. check timer (arch timer counter?) 2. WFI 3. virtual
>>>>> arch timer interrupt, causes wake-up from WFI 4. go to 1->
>>>>> 
>>>>> But you seem to get stuck at (2)?
>>>>> 
>>>> 
>>>> Exactly.
>>>> 
>>>>> When you say "print code in the interrupt handler" is that
>>>>> the UEFI interrupt handler?  In that case, you do wake up
>>>>> from the WFI...?
>>>>> 
>>>> 
>>>> I put a DEBUG print line in the Timer interrupt handler,
>>>> which prints out a message every tick letting me know the
>>>> timer was working. When we call wfi, the timer ticks still
>>>> show up (and I can see them through vgic with debugging there
>>>> enabled)
>>>> 
>>> 
>>> Which timer interrupt handler?  The UEFI one?
>>> 
>>> If you get an interrupt for the timer in UEFI, then your WFIs
>>> are not hanging, the VCPU actually resumes.  Assuming you
>>> receive the interrupts on the same CPU that did the WFI.
>>> 
>> 
>> We're running uni-proc as that's all KVM supports ATM. What
>> happens is we wfi, the interrupt fires, the interrupt handler
>> fires, and we remain at the wfi.
>> 
> 
> again, which interrupt handler?
> 
> If the one in UEFI, it sounds like you're problem is not that
> you're stuck at WFI, but that you re-execute WFI.
> 

The one in EFI, and I suspect thats the case, we re-execute wfi.
Michael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJTNeSzAAoJEGKVRgSEnX1QNHwH/RXJeAR4CGn19bMBrnDLuDBD
Llm04GcMKHt3Vl0ltg76lqPh6kBav/pFSdIn3APb0dEU9G7L1UWyegAOCkImYL0E
5jACynkUVd4Hl1CEG2TMth2uWGXA326FZfTm115TWVuYKUJKA4ivfTy4jX/E8Yz8
9HvtO1rCo2Fw8ZmUHNthkembkFilm/Y4EimmfMC1zvR0E/SEe5W40QaI8Pjtcz52
xqi8HtBiZuwXnzIsa/Cag2D8N9+iU1/nI/S9HXeqaeUAUvGsVXeG9tBpMYgiEFvR
PIsIw9ivxkwNFXRjeNnGQf2X6WWCsbEdqFuFE5cXd4BNqVaFU/stRKJCicKGeBI=
=70SB
-----END PGP SIGNATURE-----

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

Reply via email to