Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/acpica/acpi_pxm.c
Show First 20 Lines • Show All 278 Lines • ▼ Show 20 Lines | if (bootverbose) | ||||
printf("SRAT: Found CPU APIC ID %u domain %d: %s\n", | printf("SRAT: Found CPU APIC ID %u domain %d: %s\n", | ||||
cpu->ApicId, domain, | cpu->ApicId, domain, | ||||
(cpu->Flags & ACPI_SRAT_CPU_ENABLED) ? | (cpu->Flags & ACPI_SRAT_CPU_ENABLED) ? | ||||
"enabled" : "disabled"); | "enabled" : "disabled"); | ||||
if (!(cpu->Flags & ACPI_SRAT_CPU_ENABLED)) | if (!(cpu->Flags & ACPI_SRAT_CPU_ENABLED)) | ||||
break; | break; | ||||
cpup = cpu_find(cpu->ApicId); | cpup = cpu_find(cpu->ApicId); | ||||
if (cpup != NULL) { | if (cpup != NULL) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Duplicate local APIC ID %u\n", | printf("SRAT: Duplicate local APIC ID %u\n", | ||||
cpu->ApicId); | cpu->ApicId); | ||||
*(int *)arg = ENXIO; | *(int *)arg = ENXIO; | ||||
break; | break; | ||||
} | } | ||||
cpup = cpu_add(cpu->ApicId, domain); | cpup = cpu_add(cpu->ApicId, domain); | ||||
if (cpup == NULL) | if (cpup == NULL) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Ignoring local APIC ID %u (too high)\n", | printf("SRAT: Ignoring local APIC ID %u (too high)\n", | ||||
cpu->ApicId); | cpu->ApicId); | ||||
} | |||||
break; | break; | ||||
case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: | case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: | ||||
x2apic = (ACPI_SRAT_X2APIC_CPU_AFFINITY *)entry; | x2apic = (ACPI_SRAT_X2APIC_CPU_AFFINITY *)entry; | ||||
if (bootverbose) | if (bootverbose) | ||||
printf("SRAT: Found CPU APIC ID %u domain %d: %s\n", | printf("SRAT: Found CPU APIC ID %u domain %d: %s\n", | ||||
x2apic->ApicId, x2apic->ProximityDomain, | x2apic->ApicId, x2apic->ProximityDomain, | ||||
(x2apic->Flags & ACPI_SRAT_CPU_ENABLED) ? | (x2apic->Flags & ACPI_SRAT_CPU_ENABLED) ? | ||||
"enabled" : "disabled"); | "enabled" : "disabled"); | ||||
if (!(x2apic->Flags & ACPI_SRAT_CPU_ENABLED)) | if (!(x2apic->Flags & ACPI_SRAT_CPU_ENABLED)) | ||||
break; | break; | ||||
KASSERT(cpu_find(x2apic->ApicId) == NULL, | KASSERT(cpu_find(x2apic->ApicId) == NULL, | ||||
("Duplicate local APIC ID %u", x2apic->ApicId)); | ("Duplicate local APIC ID %u", x2apic->ApicId)); | ||||
cpup = cpu_add(x2apic->ApicId, x2apic->ProximityDomain); | cpup = cpu_add(x2apic->ApicId, x2apic->ProximityDomain); | ||||
if (cpup == NULL) | if (cpup == NULL) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Ignoring local APIC ID %u (too high)\n", | printf("SRAT: Ignoring local APIC ID %u (too high)\n", | ||||
x2apic->ApicId); | x2apic->ApicId); | ||||
} | |||||
break; | break; | ||||
case ACPI_SRAT_TYPE_GICC_AFFINITY: | case ACPI_SRAT_TYPE_GICC_AFFINITY: | ||||
gicc = (ACPI_SRAT_GICC_AFFINITY *)entry; | gicc = (ACPI_SRAT_GICC_AFFINITY *)entry; | ||||
if (bootverbose) | if (bootverbose) | ||||
printf("SRAT: Found CPU UID %u domain %d: %s\n", | printf("SRAT: Found CPU UID %u domain %d: %s\n", | ||||
gicc->AcpiProcessorUid, gicc->ProximityDomain, | gicc->AcpiProcessorUid, gicc->ProximityDomain, | ||||
(gicc->Flags & ACPI_SRAT_GICC_ENABLED) ? | (gicc->Flags & ACPI_SRAT_GICC_ENABLED) ? | ||||
"enabled" : "disabled"); | "enabled" : "disabled"); | ||||
if (!(gicc->Flags & ACPI_SRAT_GICC_ENABLED)) | if (!(gicc->Flags & ACPI_SRAT_GICC_ENABLED)) | ||||
break; | break; | ||||
KASSERT(cpu_find(gicc->AcpiProcessorUid) == NULL, | KASSERT(cpu_find(gicc->AcpiProcessorUid) == NULL, | ||||
("Duplicate CPU UID %u", gicc->AcpiProcessorUid)); | ("Duplicate CPU UID %u", gicc->AcpiProcessorUid)); | ||||
cpup = cpu_add(gicc->AcpiProcessorUid, gicc->ProximityDomain); | cpup = cpu_add(gicc->AcpiProcessorUid, gicc->ProximityDomain); | ||||
if (cpup == NULL) | if (cpup == NULL) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Ignoring CPU UID %u (too high)\n", | printf("SRAT: Ignoring CPU UID %u (too high)\n", | ||||
gicc->AcpiProcessorUid); | gicc->AcpiProcessorUid); | ||||
} | |||||
break; | break; | ||||
case ACPI_SRAT_TYPE_MEMORY_AFFINITY: | case ACPI_SRAT_TYPE_MEMORY_AFFINITY: | ||||
mem = (ACPI_SRAT_MEM_AFFINITY *)entry; | mem = (ACPI_SRAT_MEM_AFFINITY *)entry; | ||||
base = mem->BaseAddress; | base = mem->BaseAddress; | ||||
length = mem->Length; | length = mem->Length; | ||||
domain = mem->ProximityDomain; | domain = mem->ProximityDomain; | ||||
if (bootverbose) | if (bootverbose) | ||||
printf( | printf( | ||||
"SRAT: Found memory domain %d addr 0x%jx len 0x%jx: %s\n", | "SRAT: Found memory domain %d addr 0x%jx len 0x%jx: %s\n", | ||||
domain, (uintmax_t)base, (uintmax_t)length, | domain, (uintmax_t)base, (uintmax_t)length, | ||||
(mem->Flags & ACPI_SRAT_MEM_ENABLED) ? | (mem->Flags & ACPI_SRAT_MEM_ENABLED) ? | ||||
"enabled" : "disabled"); | "enabled" : "disabled"); | ||||
if (!(mem->Flags & ACPI_SRAT_MEM_ENABLED)) | if (!(mem->Flags & ACPI_SRAT_MEM_ENABLED)) | ||||
break; | break; | ||||
if (base >= maxphyaddr || | if (base >= maxphyaddr || | ||||
!overlaps_phys_avail(base, base + length)) { | !overlaps_phys_avail(base, base + length)) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Ignoring memory at addr 0x%jx\n", | printf("SRAT: Ignoring memory at addr 0x%jx\n", | ||||
(uintmax_t)base); | (uintmax_t)base); | ||||
break; | break; | ||||
} | } | ||||
if (num_mem == VM_PHYSSEG_MAX) { | if (num_mem == VM_PHYSSEG_MAX) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Too many memory regions\n"); | printf("SRAT: Too many memory regions\n"); | ||||
*(int *)arg = ENXIO; | *(int *)arg = ENXIO; | ||||
break; | break; | ||||
} | } | ||||
slot = num_mem; | slot = num_mem; | ||||
for (i = 0; i < num_mem; i++) { | for (i = 0; i < num_mem; i++) { | ||||
if (mem_info[i].domain == domain) { | if (mem_info[i].domain == domain) { | ||||
/* Try to extend an existing segment. */ | /* Try to extend an existing segment. */ | ||||
if (base == mem_info[i].end) { | if (base == mem_info[i].end) { | ||||
mem_info[i].end += length; | mem_info[i].end += length; | ||||
return; | return; | ||||
} | } | ||||
if (base + length == mem_info[i].start) { | if (base + length == mem_info[i].start) { | ||||
mem_info[i].start -= length; | mem_info[i].start -= length; | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
if (mem_info[i].end <= base) | if (mem_info[i].end <= base) | ||||
continue; | continue; | ||||
if (mem_info[i].start < base + length) { | if (mem_info[i].start < base + length) { | ||||
if (!(efi_boot && vm_guest == VM_GUEST_HV)) | |||||
printf("SRAT: Overlapping memory entries\n"); | printf("SRAT: Overlapping memory entries\n"); | ||||
*(int *)arg = ENXIO; | *(int *)arg = ENXIO; | ||||
return; | return; | ||||
} | } | ||||
slot = i; | slot = i; | ||||
} | } | ||||
for (i = num_mem; i > slot; i--) | for (i = num_mem; i > slot; i--) | ||||
mem_info[i] = mem_info[i - 1]; | mem_info[i] = mem_info[i - 1]; | ||||
mem_info[slot].start = base; | mem_info[slot].start = base; | ||||
▲ Show 20 Lines • Show All 334 Lines • Show Last 20 Lines |