Lines Matching refs:rom

959 static void rom_free_data(Rom *rom)  in rom_free_data()  argument
961 if (rom->mapped_file) { in rom_free_data()
962 g_mapped_file_unref(rom->mapped_file); in rom_free_data()
963 rom->mapped_file = NULL; in rom_free_data()
965 g_free(rom->data); in rom_free_data()
968 rom->data = NULL; in rom_free_data()
971 static void rom_free(Rom *rom) in rom_free() argument
973 rom_free_data(rom); in rom_free()
974 g_free(rom->path); in rom_free()
975 g_free(rom->name); in rom_free()
976 g_free(rom->fw_dir); in rom_free()
977 g_free(rom->fw_file); in rom_free()
978 g_free(rom); in rom_free()
981 static inline bool rom_order_compare(Rom *rom, Rom *item) in rom_order_compare() argument
983 return ((uintptr_t)(void *)rom->as > (uintptr_t)(void *)item->as) || in rom_order_compare()
984 (rom->as == item->as && rom->addr >= item->addr); in rom_order_compare()
987 static void rom_insert(Rom *rom) in rom_insert() argument
996 if (!rom->as) { in rom_insert()
997 rom->as = &address_space_memory; in rom_insert()
1000 rom->committed = false; in rom_insert()
1004 if (rom_order_compare(rom, item)) { in rom_insert()
1007 QTAILQ_INSERT_BEFORE(item, rom, next); in rom_insert()
1010 QTAILQ_INSERT_TAIL(&roms, rom, next); in rom_insert()
1020 static void *rom_set_mr(Rom *rom, Object *owner, const char *name, bool ro) in rom_set_mr() argument
1024 rom->mr = g_malloc(sizeof(*rom->mr)); in rom_set_mr()
1025 memory_region_init_resizeable_ram(rom->mr, owner, name, in rom_set_mr()
1026 rom->datasize, rom->romsize, in rom_set_mr()
1029 memory_region_set_readonly(rom->mr, ro); in rom_set_mr()
1030 vmstate_register_ram_global(rom->mr); in rom_set_mr()
1032 data = memory_region_get_ram_ptr(rom->mr); in rom_set_mr()
1034 memcpy(data, rom->data, rom->datasize); in rom_set_mr()
1046 Rom *rom; in rom_add_file() local
1058 rom = g_malloc0(sizeof(*rom)); in rom_add_file()
1059 rom->name = g_strdup(file); in rom_add_file()
1060 rom->path = qemu_find_file(QEMU_FILE_TYPE_BIOS, rom->name); in rom_add_file()
1061 rom->as = as; in rom_add_file()
1062 if (rom->path == NULL) { in rom_add_file()
1063 rom->path = g_strdup(file); in rom_add_file()
1066 if (!g_file_get_contents(rom->path, (gchar **) &rom->data, in rom_add_file()
1069 rom->name, gerr->message); in rom_add_file()
1074 rom->fw_dir = g_strdup(fw_dir); in rom_add_file()
1075 rom->fw_file = g_strdup(file); in rom_add_file()
1077 rom->addr = addr; in rom_add_file()
1078 rom->romsize = size; in rom_add_file()
1079 rom->datasize = rom->romsize; in rom_add_file()
1080 rom_insert(rom); in rom_add_file()
1081 if (rom->fw_file && fw_cfg) { in rom_add_file()
1086 basename = strrchr(rom->fw_file, '/'); in rom_add_file()
1090 basename = rom->fw_file; in rom_add_file()
1092 snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir, in rom_add_file()
1097 data = rom_set_mr(rom, OBJECT(fw_cfg), devpath, true); in rom_add_file()
1099 data = rom->data; in rom_add_file()
1102 fw_cfg_add_file(fw_cfg, fw_file_name, data, rom->romsize); in rom_add_file()
1105 rom->mr = mr; in rom_add_file()
1116 rom_free(rom); in rom_add_file()
1126 Rom *rom; in rom_add_blob() local
1129 rom = g_malloc0(sizeof(*rom)); in rom_add_blob()
1130 rom->name = g_strdup(name); in rom_add_blob()
1131 rom->as = as; in rom_add_blob()
1132 rom->addr = addr; in rom_add_blob()
1133 rom->romsize = max_len ? max_len : len; in rom_add_blob()
1134 rom->datasize = len; in rom_add_blob()
1135 g_assert(rom->romsize >= rom->datasize); in rom_add_blob()
1136 rom->data = g_malloc0(rom->datasize); in rom_add_blob()
1137 memcpy(rom->data, blob, len); in rom_add_blob()
1138 rom_insert(rom); in rom_add_blob()
1150 data = rom_set_mr(rom, OBJECT(fw_cfg), devpath, read_only); in rom_add_blob()
1151 mr = rom->mr; in rom_add_blob()
1153 data = rom->data; in rom_add_blob()
1158 data, rom->datasize, read_only); in rom_add_blob()
1172 Rom *rom; in rom_add_elf_program() local
1174 rom = g_malloc0(sizeof(*rom)); in rom_add_elf_program()
1175 rom->name = g_strdup(name); in rom_add_elf_program()
1176 rom->addr = addr; in rom_add_elf_program()
1177 rom->datasize = datasize; in rom_add_elf_program()
1178 rom->romsize = romsize; in rom_add_elf_program()
1179 rom->data = data; in rom_add_elf_program()
1180 rom->as = as; in rom_add_elf_program()
1184 rom->mapped_file = mapped_file; in rom_add_elf_program()
1187 rom_insert(rom); in rom_add_elf_program()
1203 Rom *rom; in rom_reset() local
1205 QTAILQ_FOREACH(rom, &roms, next) { in rom_reset()
1206 if (rom->fw_file) { in rom_reset()
1215 if (rom->data && rom->isrom) { in rom_reset()
1220 rom_free_data(rom); in rom_reset()
1225 if (rom->data == NULL) { in rom_reset()
1228 if (rom->mr) { in rom_reset()
1229 void *host = memory_region_get_ram_ptr(rom->mr); in rom_reset()
1230 memcpy(host, rom->data, rom->datasize); in rom_reset()
1231 memset(host + rom->datasize, 0, rom->romsize - rom->datasize); in rom_reset()
1233 address_space_write_rom(rom->as, rom->addr, MEMTXATTRS_UNSPECIFIED, in rom_reset()
1234 rom->data, rom->datasize); in rom_reset()
1235 address_space_set(rom->as, rom->addr + rom->datasize, 0, in rom_reset()
1236 rom->romsize - rom->datasize, in rom_reset()
1239 if (rom->isrom) { in rom_reset()
1241 rom_free_data(rom); in rom_reset()
1249 cpu_flush_icache_range(rom->addr, rom->datasize); in rom_reset()
1251 trace_loader_write_rom(rom->name, rom->addr, rom->datasize, rom->isrom); in rom_reset()
1265 static const char *rom_as_name(Rom *rom) in rom_as_name() argument
1267 const char *name = rom->as ? rom->as->name : NULL; in rom_as_name()
1283 static void rom_print_one_overlap_error(Rom *last_rom, Rom *rom) in rom_print_one_overlap_error() argument
1287 rom_as_name(rom)); in rom_print_one_overlap_error()
1293 rom->name, rom->addr, rom->addr + rom->romsize); in rom_print_one_overlap_error()
1299 Rom *rom, *last_rom = NULL; in rom_check_and_register_reset() local
1302 QTAILQ_FOREACH(rom, &roms, next) { in rom_check_and_register_reset()
1303 if (rom->fw_file) { in rom_check_and_register_reset()
1306 if (!rom->mr) { in rom_check_and_register_reset()
1307 if (roms_overlap(last_rom, rom)) { in rom_check_and_register_reset()
1312 rom_print_one_overlap_error(last_rom, rom); in rom_check_and_register_reset()
1315 last_rom = rom; in rom_check_and_register_reset()
1317 section = memory_region_find(rom->mr ? rom->mr : get_system_memory(), in rom_check_and_register_reset()
1318 rom->addr, 1); in rom_check_and_register_reset()
1319 rom->isrom = int128_nz(section.size) && memory_region_is_rom(section.mr); in rom_check_and_register_reset()
1338 Rom *rom; in rom_transaction_begin() local
1341 QTAILQ_FOREACH(rom, &roms, next) { in rom_transaction_begin()
1342 rom->committed = true; in rom_transaction_begin()
1348 Rom *rom; in rom_transaction_end() local
1351 QTAILQ_FOREACH_SAFE(rom, &roms, next, tmp) { in rom_transaction_end()
1352 if (rom->committed) { in rom_transaction_end()
1356 rom->committed = true; in rom_transaction_end()
1358 QTAILQ_REMOVE(&roms, rom, next); in rom_transaction_end()
1359 rom_free(rom); in rom_transaction_end()
1366 Rom *rom; in find_rom() local
1368 QTAILQ_FOREACH(rom, &roms, next) { in find_rom()
1369 if (rom->fw_file) { in find_rom()
1372 if (rom->mr) { in find_rom()
1375 if (rom->addr > addr) { in find_rom()
1378 if (rom->addr + rom->romsize < addr + size) { in find_rom()
1381 return rom; in find_rom()
1420 Rom *rom; in rom_find_largest_gap_between() local
1427 QTAILQ_FOREACH(rom, &roms, next) { in rom_find_largest_gap_between()
1429 if (rom->mr || rom->fw_file) { in rom_find_largest_gap_between()
1433 if (rom->addr + rom->romsize <= base) { in rom_find_largest_gap_between()
1437 if (rom->addr >= base + size) { in rom_find_largest_gap_between()
1442 secs = add_romsec_to_list(secs, rom->addr, 1); in rom_find_largest_gap_between()
1444 if (rom->addr + rom->romsize < base + size) { in rom_find_largest_gap_between()
1445 secs = add_romsec_to_list(secs, rom->addr + rom->romsize, -1); in rom_find_largest_gap_between()
1482 Rom *rom; in rom_copy() local
1484 QTAILQ_FOREACH(rom, &roms, next) { in rom_copy()
1485 if (rom->fw_file) { in rom_copy()
1488 if (rom->mr) { in rom_copy()
1491 if (rom->addr + rom->romsize < addr) { in rom_copy()
1494 if (rom->addr > end || rom->addr < addr) { in rom_copy()
1498 d = dest + (rom->addr - addr); in rom_copy()
1499 s = rom->data; in rom_copy()
1500 l = rom->datasize; in rom_copy()
1510 if (rom->romsize > rom->datasize) { in rom_copy()
1516 l = rom->romsize - rom->datasize; in rom_copy()
1536 Rom *rom; in rom_ptr() local
1538 rom = find_rom(addr, size); in rom_ptr()
1539 if (!rom || !rom->data) in rom_ptr()
1541 return rom->data + (addr - rom->addr); in rom_ptr()
1548 void *rom; /* Output: rom data pointer, if found */ member
1562 cbdata->rom = rom_ptr(alias_addr, cbdata->size); in find_rom_cb()
1563 if (!cbdata->rom) { in find_rom_cb()
1595 void *rom; in rom_ptr_for_as() local
1600 rom = rom_ptr(addr, size); in rom_ptr_for_as()
1601 if (rom) { in rom_ptr_for_as()
1602 return rom; in rom_ptr_for_as()
1616 return cbdata.rom; in rom_ptr_for_as()
1621 Rom *rom; in qmp_x_query_roms() local
1624 QTAILQ_FOREACH(rom, &roms, next) { in qmp_x_query_roms()
1625 if (rom->mr) { in qmp_x_query_roms()
1628 memory_region_name(rom->mr), in qmp_x_query_roms()
1629 rom->romsize, in qmp_x_query_roms()
1630 rom->name); in qmp_x_query_roms()
1631 } else if (!rom->fw_file) { in qmp_x_query_roms()
1634 rom->addr, rom->romsize, in qmp_x_query_roms()
1635 rom->isrom ? "rom" : "ram", in qmp_x_query_roms()
1636 rom->name); in qmp_x_query_roms()
1640 rom->fw_dir, in qmp_x_query_roms()
1641 rom->fw_file, in qmp_x_query_roms()
1642 rom->romsize, in qmp_x_query_roms()
1643 rom->name); in qmp_x_query_roms()