Question:
Modern hardware relies primarily on memory mapped I/O which is typically
at addresses that are not mapped by the kernels initial page tables,
which makes using them currently unusable for early debugging print support.
So this patch set digs in and fixes the early page tables on both
arch/i386 and arch/x86_64 so that set_fixmap works with our initial boot
page tables. All that is needed is that we allocate preallocate the pte
page that the fixmap entries live on.
On arch/i386 I accomplish this by ensuring the boot time page tables are
in the native mode. Doing this provides an alternative and slightly
more capable fix to Jeremy's problem of not having the initial memory
mapping covering enough pages to identity map all of low memory. Because
we are now updating the page table we are running on we add the mappings
we need for the initial page table as we build the initial page table.
Since I was in there I kept cleaning up arch/i386/head.S.
In particular I have gotten as far as removing the early cpuid,
and have added a head32.S.
Answer:
This patch preallocates the intermediate page table entries so that
all that is needed to setup a fixmap is to fill in the appropriate
pte.
By doing this modern hardware that uses memory mapped access can be
talked to early in boot through a fixmap.
Currently in head.S there are two ways we test to see if we
are the boot cpu. By looking at %ebx and by looking at the
static variable ready. When changing things around I have
found that it gets tricky to preserve %ebx. So this
patch just switches head.S over to the more reliable
test of always using ready.
I am preparing to convert the boot time page table to the kernels
native format. To achieve that I need to enable PAE. Enabling PSE
and the no execute bit would not hurt. So this patch modifies
the boot cpu path to execute all of the kernels enable code
if and only if we have the proper bits set in mmu_cr4_features.
If we don't set the leaf page table entries it is quite possible that
will inherit and incorrect page table entry from the initial boot
page table setup in head.S. So we need to redo the effort here,
so we pick up PSE, PGE and the like.
Hypervisors like Xen require that their page tables be read-only,
which is slightly incompatible with our low identity mappings, however
I discussed this with Jeremy he has modified the Xen early set_pte
function to avoid problems in this area.
Andi I sent this once a part of the discussion on this issue so
you may already have this patch in your queue.