arch/x86/kernel/machine_kexec_64.c

Source file repositories/reference/linux-study-clean/arch/x86/kernel/machine_kexec_64.c

File Facts

System
Linux kernel
Corpus path
arch/x86/kernel/machine_kexec_64.c
Extension
.c
Size
18622 bytes
Lines
710
Domain
Architecture Layer
Bucket
arch/x86
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct init_pgtable_data {
	struct x86_mapping_info *info;
	pgd_t *level4p;
};

static int mem_region_callback(struct resource *res, void *arg)
{
	struct init_pgtable_data *data = arg;

	return kernel_ident_mapping_init(data->info, data->level4p,
					 res->start, res->end + 1);
}

static int
map_acpi_tables(struct x86_mapping_info *info, pgd_t *level4p)
{
	struct init_pgtable_data data;
	unsigned long flags;
	int ret;

	data.info = info;
	data.level4p = level4p;
	flags = IORESOURCE_MEM | IORESOURCE_BUSY;

	ret = walk_iomem_res_desc(IORES_DESC_ACPI_TABLES, flags, 0, -1,
				  &data, mem_region_callback);
	if (ret && ret != -EINVAL)
		return ret;

	/* ACPI tables could be located in ACPI Non-volatile Storage region */
	ret = walk_iomem_res_desc(IORES_DESC_ACPI_NV_STORAGE, flags, 0, -1,
				  &data, mem_region_callback);
	if (ret && ret != -EINVAL)
		return ret;

	return 0;
}
#else
static int map_acpi_tables(struct x86_mapping_info *info, pgd_t *level4p) { return 0; }
#endif

static int map_mmio_serial(struct x86_mapping_info *info, pgd_t *level4p)
{
	unsigned long mstart, mend;

	if (!kexec_debug_8250_mmio32)
		return 0;

	mstart = kexec_debug_8250_mmio32 & PAGE_MASK;
	mend = (kexec_debug_8250_mmio32 + PAGE_SIZE + 23) & PAGE_MASK;
	pr_info("Map PCI serial at %lx - %lx\n", mstart, mend);
	return kernel_ident_mapping_init(info, level4p, mstart, mend);
}

#ifdef CONFIG_KEXEC_FILE
const struct kexec_file_ops * const kexec_file_loaders[] = {
		&kexec_bzImage64_ops,
		NULL
};
#endif

static int
map_efi_systab(struct x86_mapping_info *info, pgd_t *level4p)
{
#ifdef CONFIG_EFI
	unsigned long mstart, mend;
	void *kaddr;
	int ret;

	if (!efi_enabled(EFI_BOOT))
		return 0;

	mstart = (boot_params.efi_info.efi_systab |
			((u64)boot_params.efi_info.efi_systab_hi<<32));

	if (efi_enabled(EFI_64BIT))
		mend = mstart + sizeof(efi_system_table_64_t);
	else
		mend = mstart + sizeof(efi_system_table_32_t);

	if (!mstart)
		return 0;

	ret = kernel_ident_mapping_init(info, level4p, mstart, mend);
	if (ret)
		return ret;

	kaddr = memremap(mstart, mend - mstart, MEMREMAP_WB);
	if (!kaddr) {
		pr_err("Could not map UEFI system table\n");

Annotation

Implementation Notes