• Yinghai Lu's avatar
    x86: insert_resorce for lapic addr after e820_reserve_resources · 1e934dda
    Yinghai Lu authored
    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: default avatarYinghai Lu <yinghai.lu@sun.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    1e934dda
apic_64.c 31.2 KB