x86: insert_resorce for lapic addr after e820_reserve_resources
when comparing the e820 direct from BIOS, and the one by kexec:
BIOS-provided physical RAM map:
- BIOS-e820:
0000000000000000 -
0000000000097400 (usable)
+ BIOS-e820:
0000000000000100 -
0000000000097400 (usable)
BIOS-e820:
0000000000097400 -
00000000000a0000 (reserved)
BIOS-e820:
00000000000e6000 -
0000000000100000 (reserved)
BIOS-e820:
0000000000100000 -
00000000dffa0000 (usable)
- BIOS-e820:
00000000dffae000 -
00000000dffb0000 type 9
+ BIOS-e820:
00000000dffae000 -
00000000dffb0000 (reserved)
BIOS-e820:
00000000dffb0000 -
00000000dffbe000 (ACPI data)
BIOS-e820:
00000000dffbe000 -
00000000dfff0000 (ACPI NVS)
BIOS-e820:
00000000dfff0000 -
00000000e0000000 (reserved)
BIOS-e820:
00000000fec00000 -
00000000fec01000 (reserved)
- BIOS-e820:
00000000fee00000 -
00000000fee01000 (reserved)
=======> that is the local apic address... somewhere we lost it
BIOS-e820:
00000000ff700000 -
0000000100000000 (reserved)
BIOS-e820:
0000000100000000 -
0000004020000000 (usable)
found one entry about reserved is missing for the kernel by kexec.
it turns out init_apic_mappings is called before e820_reserve_resources
in setup_arch. but e820_reserve_resources is using request_resource.
it will not handle the conflicts.
there are three ways to fix it:
1. change request_resource in e820_reserve_resources to to insert_resource
2. move init_apic_mappings after e820_reserve_resources
3. use late_initcall to insert lapic resource.
this patch is using method 3, that is less intrusive.
in later version could consider to use method 1.
before patch
fed20000-
ffffffff : PCI Bus #00
fee00000-
fee00fff : Local APIC
fefff000-
feffffff : pnp 00:09
ff700000-
ffffffff : reserved
with patch will get map in first kernel
fed20000-
ffffffff : PCI Bus #00
fee00000-
fee00fff : Local APIC
fee00000-
fee00fff : reserved
fefff000-
feffffff : pnp 00:09
ff700000-
ffffffff : reserved
Signed-off-by: Yinghai Lu <yinghai.lu@sun.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>