arch/powerpc/platforms/pseries/rtas-fadump.c
Source file repositories/reference/linux-study-clean/arch/powerpc/platforms/pseries/rtas-fadump.c
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/platforms/pseries/rtas-fadump.c- Extension
.c- Size
- 20711 bytes
- Lines
- 664
- Domain
- Architecture Layer
- Bucket
- arch/powerpc
- 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.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/string.hlinux/memblock.hlinux/delay.hlinux/seq_file.hlinux/crash_dump.hlinux/of.hlinux/of_fdt.hasm/page.hasm/rtas.hasm/setup.hasm/fadump.hasm/fadump-internal.hrtas-fadump.h
Detected Declarations
function rtas_fadump_update_configfunction rtas_fadump_get_configfunction rtas_fadump_init_mem_structfunction rtas_fadump_get_bootmem_minfunction rtas_fadump_callfunction rtas_fadump_registerfunction rtas_fadump_unregisterfunction rtas_fadump_invalidatefunction rtas_fadump_gpr_indexfunction rtas_fadump_set_regvalfunction rtas_fadump_read_regsfunction rtas_fadump_build_cpu_notesfunction fadump_str_to_u64function rtas_fadump_processfunction rtas_fadump_region_showfunction rtas_fadump_triggerfunction rtas_fadump_max_boot_mem_rgnsfunction rtas_fadump_dt_scan
Annotated Snippet
switch (type) {
case RTAS_FADUMP_CPU_STATE_DATA:
addr = be64_to_cpu(fdm->rgn[i].destination_address);
fadump_conf->cpu_state_dest_vaddr = (u64)__va(addr);
/*
* Start address of reserve dump area (permanent reservation) for
* re-registering FADump after dump capture.
*/
fadump_conf->reserve_dump_area_start = addr;
break;
case RTAS_FADUMP_HPTE_REGION:
/* Not processed currently. */
break;
case RTAS_FADUMP_REAL_MODE_REGION:
base = be64_to_cpu(fdm->rgn[i].source_address);
size = be64_to_cpu(fdm->rgn[i].source_len);
pr_debug("\t[%03d] base: 0x%lx, size: 0x%lx\n", i, base, size);
if (!base) {
fadump_conf->boot_mem_dest_addr =
be64_to_cpu(fdm->rgn[i].destination_address);
}
fadump_conf->boot_mem_addr[fadump_conf->boot_mem_regs_cnt] = base;
fadump_conf->boot_mem_sz[fadump_conf->boot_mem_regs_cnt] = size;
fadump_conf->boot_memory_size += size;
hole_size += (base - last_end);
last_end = base + size;
fadump_conf->boot_mem_regs_cnt++;
break;
case RTAS_FADUMP_PARAM_AREA:
fadump_conf->param_area = be64_to_cpu(fdm->rgn[i].destination_address);
break;
default:
pr_warn("Section type %d unsupported on this kernel. Ignoring!\n", type);
break;
}
}
fadump_conf->boot_mem_top = fadump_conf->boot_memory_size + hole_size;
rtas_fadump_update_config(fadump_conf, fdm);
}
static u64 rtas_fadump_init_mem_struct(struct fw_dump *fadump_conf)
{
u64 addr = fadump_conf->reserve_dump_area_start;
u16 sec_cnt = 0;
memset(&fdm, 0, sizeof(struct rtas_fadump_mem_struct));
addr = addr & PAGE_MASK;
fdm.header.dump_format_version = cpu_to_be32(0x00000001);
fdm.header.dump_status_flag = 0;
fdm.header.offset_first_dump_section =
cpu_to_be32((u32)offsetof(struct rtas_fadump_mem_struct, rgn));
/*
* Fields for disk dump option.
* We are not using disk dump option, hence set these fields to 0.
*/
fdm.header.dd_block_size = 0;
fdm.header.dd_block_offset = 0;
fdm.header.dd_num_blocks = 0;
fdm.header.dd_offset_disk_path = 0;
/* set 0 to disable an automatic dump-reboot. */
fdm.header.max_time_auto = 0;
/* Kernel dump sections */
/* cpu state data section. */
fdm.rgn[sec_cnt].request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);
fdm.rgn[sec_cnt].source_data_type = cpu_to_be16(RTAS_FADUMP_CPU_STATE_DATA);
fdm.rgn[sec_cnt].source_address = 0;
fdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->cpu_state_data_size);
fdm.rgn[sec_cnt].destination_address = cpu_to_be64(addr);
addr += fadump_conf->cpu_state_data_size;
sec_cnt++;
/* hpte region section */
fdm.rgn[sec_cnt].request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);
fdm.rgn[sec_cnt].source_data_type = cpu_to_be16(RTAS_FADUMP_HPTE_REGION);
fdm.rgn[sec_cnt].source_address = 0;
fdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->hpte_region_size);
fdm.rgn[sec_cnt].destination_address = cpu_to_be64(addr);
addr += fadump_conf->hpte_region_size;
sec_cnt++;
/*
* Align boot memory area destination address to page boundary to
* be able to mmap read this area in the vmcore.
Annotation
- Immediate include surface: `linux/string.h`, `linux/memblock.h`, `linux/delay.h`, `linux/seq_file.h`, `linux/crash_dump.h`, `linux/of.h`, `linux/of_fdt.h`, `asm/page.h`.
- Detected declarations: `function rtas_fadump_update_config`, `function rtas_fadump_get_config`, `function rtas_fadump_init_mem_struct`, `function rtas_fadump_get_bootmem_min`, `function rtas_fadump_call`, `function rtas_fadump_register`, `function rtas_fadump_unregister`, `function rtas_fadump_invalidate`, `function rtas_fadump_gpr_index`, `function rtas_fadump_set_regval`.
- Atlas domain: Architecture Layer / arch/powerpc.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.