On Fri, Mar 28, 2014 at 05:08:03PM -0400, Michael Casadevall wrote:
> -----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.

if you run the interrupt handler you are not stuck in wfi, but
re-execute it, and it's your software wait condition which is the
problem - likely related to the missing rtc?

-Christoffer

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

Reply via email to