/* TODO: Add upper time limit for the delay */ do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_REGISTER, &fdm, fdm_size);
wait_time = rtas_busy_delay_time(rc); if (wait_time)
mdelay(wait_time);
} while (wait_time);
switch (rc) { case0:
pr_info("Registration is successful!\n");
fadump_conf->dump_registered = 1;
err = 0; break; case -1:
pr_err("Failed to register. Hardware Error(%d).\n", rc); break; case -3: if (!is_fadump_reserved_mem_contiguous())
pr_err("Can't have holes in reserved memory area.\n");
pr_err("Failed to register. Parameter Error(%d).\n", rc);
err = -EINVAL; break; case -9:
pr_err("Already registered!\n");
fadump_conf->dump_registered = 1;
err = -EEXIST; break; default:
pr_err("Failed to register. Unknown Error(%d).\n", rc); break;
}
return err;
}
staticint rtas_fadump_unregister(struct fw_dump *fadump_conf)
{ unsignedint wait_time; int rc;
/* TODO: Add upper time limit for the delay */ do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_UNREGISTER, &fdm, sizeof(struct rtas_fadump_mem_struct));
wait_time = rtas_busy_delay_time(rc); if (wait_time)
mdelay(wait_time);
} while (wait_time);
if (rc) {
pr_err("Failed to un-register - unexpected error(%d).\n", rc); return -EIO;
}
fadump_conf->dump_registered = 0; return0;
}
staticint rtas_fadump_invalidate(struct fw_dump *fadump_conf)
{ unsignedint wait_time; int rc;
/* TODO: Add upper time limit for the delay */ do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_INVALIDATE, fdm_active, sizeof(struct rtas_fadump_mem_struct));
wait_time = rtas_busy_delay_time(rc); if (wait_time)
mdelay(wait_time);
} while (wait_time);
if (rc) {
pr_err("Failed to invalidate - unexpected error (%d).\n", rc); return -EIO;
}
#define RTAS_FADUMP_GPR_MASK 0xffffff0000000000 staticinlineint rtas_fadump_gpr_index(u64 id)
{ char str[3]; int i = -1;
if ((id & RTAS_FADUMP_GPR_MASK) == fadump_str_to_u64("GPR")) { /* get the digits at the end */
id &= ~RTAS_FADUMP_GPR_MASK;
id >>= 24;
str[2] = '\0';
str[1] = id & 0xff;
str[0] = (id >> 8) & 0xff; if (kstrtoint(str, 10, &i))
i = -EINVAL; if (i > 31)
i = -1;
} return i;
}
/* Check if the dump data is valid. */ for (int i = 0; i < be16_to_cpu(fdm_active->header.dump_num_sections); i++) { int type = be16_to_cpu(fdm_active->rgn[i].source_data_type); int rc = 0;
switch (type) { case RTAS_FADUMP_CPU_STATE_DATA: case RTAS_FADUMP_HPTE_REGION: case RTAS_FADUMP_REAL_MODE_REGION: if (fdm_active->rgn[i].error_flags != 0) {
pr_err("Dump taken by platform is not valid (%d)\n", i);
rc = -EINVAL;
} if (fdm_active->rgn[i].bytes_dumped != fdm_active->rgn[i].source_len) {
pr_err("Dump taken by platform is incomplete (%d)\n", i);
rc = -EINVAL;
} if (rc) {
pr_warn("Region type: %u src addr: 0x%llx dest addr: 0x%llx\n",
be16_to_cpu(fdm_active->rgn[i].source_data_type),
be64_to_cpu(fdm_active->rgn[i].source_address),
be64_to_cpu(fdm_active->rgn[i].destination_address)); return rc;
} break; case RTAS_FADUMP_PARAM_AREA: if (fdm_active->rgn[i].bytes_dumped != fdm_active->rgn[i].source_len ||
fdm_active->rgn[i].error_flags != 0) {
pr_warn("Failed to process additional parameters! Proceeding anyway..\n");
fadump_conf->param_area = 0;
} break; default: /* *Ifthefirst/crashedkerneladdedanewregiontypethatthe *second/fadumpkerneldoesn'trecognize,skipitandprocess *assumingbackwardcompatibility.
*/
pr_warn("Unknown region found: type: %u src addr: 0x%llx dest addr: 0x%llx\n",
be16_to_cpu(fdm_active->rgn[i].source_data_type),
be64_to_cpu(fdm_active->rgn[i].source_address),
be64_to_cpu(fdm_active->rgn[i].destination_address)); break;
}
}
/* Dump is active. Show preserved area start address. */ if (fdm_active) {
seq_printf(m, "\nMemory above %#016llx is reserved for saving crash dump\n",
fadump_conf->boot_mem_top);
}
}
/* Get the sizes required to store dump data for the firmware provided *dumpsections. *Foreachdumpsectiontypesupported,a32bitcellwhichdefines *theIDofasupportedsectionfollowedbytwo32bitcellswhich *givesthesizeofthesectioninbytes.
*/
sections = of_get_flat_dt_prop(node, "ibm,configure-kernel-dump-sizes",
&size);
if (!sections) return;
num_sections = size / (3 * sizeof(u32));
for (i = 0; i < num_sections; i++, sections += 3) {
u32 type = (u32)of_read_number(sections, 1);
switch (type) { case RTAS_FADUMP_CPU_STATE_DATA:
fadump_conf->cpu_state_data_size =
of_read_ulong(§ions[1], 2); break; case RTAS_FADUMP_HPTE_REGION:
fadump_conf->hpte_region_size =
of_read_ulong(§ions[1], 2); break;
}
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.