mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
Merge tag 'x86-urgent-2020-08-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Ingo Molnar: "Misc fixes and small updates all around the place: - Fix mitigation state sysfs output - Fix an FPU xstate/sxave code assumption bug triggered by Architectural LBR support - Fix Lightning Mountain SoC TSC frequency enumeration bug - Fix kexec debug output - Fix kexec memory range assumption bug - Fix a boundary condition in the crash kernel code - Optimize porgatory.ro generation a bit - Enable ACRN guests to use X2APIC mode - Reduce a __text_poke() IRQs-off critical section for the benefit of PREEMPT_RT" * tag 'x86-urgent-2020-08-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/alternatives: Acquire pte lock with interrupts enabled x86/bugs/multihit: Fix mitigation reporting when VMX is not in use x86/fpu/xstate: Fix an xstate size check warning with architectural LBRs x86/purgatory: Don't generate debug info for purgatory.ro x86/tsr: Fix tsc frequency enumeration bug on Lightning Mountain SoC kexec_file: Correctly output debugging information for the PT_LOAD ELF header kexec: Improve & fix crash_exclude_mem_range() to handle overlapping ranges x86/crash: Correct the address boundary of function parameters x86/acrn: Remove redundant chars from ACRN signature x86/acrn: Allow ACRN guest to use X2APIC mode
This commit is contained in:
@@ -1169,24 +1169,26 @@ int crash_exclude_mem_range(struct crash_mem *mem,
|
||||
unsigned long long mstart, unsigned long long mend)
|
||||
{
|
||||
int i, j;
|
||||
unsigned long long start, end;
|
||||
unsigned long long start, end, p_start, p_end;
|
||||
struct crash_mem_range temp_range = {0, 0};
|
||||
|
||||
for (i = 0; i < mem->nr_ranges; i++) {
|
||||
start = mem->ranges[i].start;
|
||||
end = mem->ranges[i].end;
|
||||
p_start = mstart;
|
||||
p_end = mend;
|
||||
|
||||
if (mstart > end || mend < start)
|
||||
continue;
|
||||
|
||||
/* Truncate any area outside of range */
|
||||
if (mstart < start)
|
||||
mstart = start;
|
||||
p_start = start;
|
||||
if (mend > end)
|
||||
mend = end;
|
||||
p_end = end;
|
||||
|
||||
/* Found completely overlapping range */
|
||||
if (mstart == start && mend == end) {
|
||||
if (p_start == start && p_end == end) {
|
||||
mem->ranges[i].start = 0;
|
||||
mem->ranges[i].end = 0;
|
||||
if (i < mem->nr_ranges - 1) {
|
||||
@@ -1197,20 +1199,29 @@ int crash_exclude_mem_range(struct crash_mem *mem,
|
||||
mem->ranges[j].end =
|
||||
mem->ranges[j+1].end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Continue to check if there are another overlapping ranges
|
||||
* from the current position because of shifting the above
|
||||
* mem ranges.
|
||||
*/
|
||||
i--;
|
||||
mem->nr_ranges--;
|
||||
continue;
|
||||
}
|
||||
mem->nr_ranges--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mstart > start && mend < end) {
|
||||
if (p_start > start && p_end < end) {
|
||||
/* Split original range */
|
||||
mem->ranges[i].end = mstart - 1;
|
||||
temp_range.start = mend + 1;
|
||||
mem->ranges[i].end = p_start - 1;
|
||||
temp_range.start = p_end + 1;
|
||||
temp_range.end = end;
|
||||
} else if (mstart != start)
|
||||
mem->ranges[i].end = mstart - 1;
|
||||
} else if (p_start != start)
|
||||
mem->ranges[i].end = p_start - 1;
|
||||
else
|
||||
mem->ranges[i].start = mend + 1;
|
||||
mem->ranges[i].start = p_end + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1247,7 +1258,7 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
|
||||
unsigned long long notes_addr;
|
||||
unsigned long mstart, mend;
|
||||
|
||||
/* extra phdr for vmcoreinfo elf note */
|
||||
/* extra phdr for vmcoreinfo ELF note */
|
||||
nr_phdr = nr_cpus + 1;
|
||||
nr_phdr += mem->nr_ranges;
|
||||
|
||||
@@ -1255,7 +1266,7 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
|
||||
* kexec-tools creates an extra PT_LOAD phdr for kernel text mapping
|
||||
* area (for example, ffffffff80000000 - ffffffffa0000000 on x86_64).
|
||||
* I think this is required by tools like gdb. So same physical
|
||||
* memory will be mapped in two elf headers. One will contain kernel
|
||||
* memory will be mapped in two ELF headers. One will contain kernel
|
||||
* text virtual addresses and other will have __va(physical) addresses.
|
||||
*/
|
||||
|
||||
@@ -1282,7 +1293,7 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
|
||||
ehdr->e_ehsize = sizeof(Elf64_Ehdr);
|
||||
ehdr->e_phentsize = sizeof(Elf64_Phdr);
|
||||
|
||||
/* Prepare one phdr of type PT_NOTE for each present cpu */
|
||||
/* Prepare one phdr of type PT_NOTE for each present CPU */
|
||||
for_each_present_cpu(cpu) {
|
||||
phdr->p_type = PT_NOTE;
|
||||
notes_addr = per_cpu_ptr_to_phys(per_cpu_ptr(crash_notes, cpu));
|
||||
@@ -1324,10 +1335,10 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
|
||||
phdr->p_filesz = phdr->p_memsz = mend - mstart + 1;
|
||||
phdr->p_align = 0;
|
||||
ehdr->e_phnum++;
|
||||
phdr++;
|
||||
pr_debug("Crash PT_LOAD elf header. phdr=%p vaddr=0x%llx, paddr=0x%llx, sz=0x%llx e_phnum=%d p_offset=0x%llx\n",
|
||||
pr_debug("Crash PT_LOAD ELF header. phdr=%p vaddr=0x%llx, paddr=0x%llx, sz=0x%llx e_phnum=%d p_offset=0x%llx\n",
|
||||
phdr, phdr->p_vaddr, phdr->p_paddr, phdr->p_filesz,
|
||||
ehdr->e_phnum, phdr->p_offset);
|
||||
phdr++;
|
||||
}
|
||||
|
||||
*addr = buf;
|
||||
|
Reference in New Issue
Block a user