On Thu, Feb 21, 2013 at 4:34 PM, H. Peter Anvin <hpa@xxxxxxxxxxxxxxx> wrote: > > This is a huge set of several partly interrelated (and concurrently > developed) changes, which is why the branch history is messier than > one would like. > > The *really* big items are two humonguous patchsets mostly developed > by Yinghai Lu at my request, which completely revamps the way we > create initial page tables. Ugh. So I've tried to walk through this, and it's painful. If this results in problems, we're going to be *so* screwed. Is it bisectable? I also don't understand how "early_idt_handler" could *possibly* work. In particular, it seems to rely on the trap number being set up in the stack frame: cmpl $14,72(%rsp) # Page fault? but that's not even *true*. Why? Because we export both the early_idt_handlers[] array (that sets up the trap number and makes the stack frame be reliable) and the single early_idt_handler function (that relies on the trap number and the reliable stack frame), AND AFAIK WE USE THE LATTER! See x86_64_start_kernel(): for (i = 0; i < NUM_EXCEPTION_VECTORS; i++) { #ifdef CONFIG_EARLY_PRINTK set_intr_gate(i, &early_idt_handlers[i]); #else set_intr_gate(i, early_idt_handler); #endif } so unless you have CONFIG_EARLY_PRINTK, the interrupt gate will point to that raw early_idt_handler function that doesn't *work* on its own, afaik. Btw, it's not just the page fault index testing that is wrong. The whole cmpl $__KERNEL_CS,96(%rsp) jne 11f also relies on the stack frame being set up the same way for all exceptions - which again is only true if we ran through the early_idt_handlers[] prologue that added the extra stack entry. How does this even work for me? I don't have EARLY_PRINTK enabled. What am I missing? Linus