/* SPDX-License-Identifier: GPL-2.0 */ /* * Compact binary representation of ihex records. Some devices need their * firmware loaded in strange orders rather than a single big blob, but * actually parsing ihex-as-text within the kernel seems silly. Thus,...
*/
/* Intel HEX files actually limit the length to 256 bytes, but we have drivers which would benefit from using separate records which are
longer than that, so we extend to 16 bits of length */ struct ihex_binrec {
__be32 addr;
__be16 len;
uint8_t data[];
} __attribute__((packed));
/* Check that ihex_next_binrec() won't take us off the end of the image... */ staticinlineint ihex_validate_fw(conststruct firmware *fw)
{ conststruct ihex_binrec *end, *rec;
rec = (constvoid *)fw->data;
end = (constvoid *)&fw->data[fw->size - sizeof(*end)];
for (; rec <= end; rec = __ihex_next_binrec(rec)) { /* Zero length marks end of records */ if (rec == end && !be16_to_cpu(rec->len)) return 0;
} return -EINVAL;
}
/* Request firmware and validate it so that we can trust we won't
* run off the end while reading records... */ staticinlineint request_ihex_firmware(conststruct firmware **fw, constchar *fw_name, struct device *dev)
{ conststruct firmware *lfw; int ret;
ret = request_firmware(&lfw, fw_name, dev); if (ret) return ret;
ret = ihex_validate_fw(lfw); if (ret) {
dev_err(dev, "Firmware \"%s\" not valid IHEX records\n",
fw_name);
release_firmware(lfw); return ret;
}
*fw = lfw; return 0;
} #endif/* __LINUX_IHEX_H__ */
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet)
¤
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 ist noch experimentell.