diff options
94 files changed, 11141 insertions, 345 deletions
diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml index f01978f..e296fc3 100644 --- a/.gitlab-ci.d/buildtest.yml +++ b/.gitlab-ci.d/buildtest.yml @@ -736,7 +736,7 @@ pages: - make gtags # We unset variables to work around a bug in some htags versions # which causes it to fail when the environment is large - - CI_COMMIT_MESSAGE= CI_COMMIT_TAG_MESSAGE= htags + - CI_COMMIT_MESSAGE= CI_COMMIT_TAG_MESSAGE= CI_COMMIT_DESCRIPTION= htags -anT --tree-view=filetree -m qemu_init -t "Welcome to the QEMU sourcecode" - mv HTML public/src diff --git a/MAINTAINERS b/MAINTAINERS index 70eb024..24b71a4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1276,7 +1276,7 @@ F: include/hw/pci-host/astro.h F: include/hw/pci-host/dino.h F: pc-bios/hppa-firmware.img F: roms/seabios-hppa/ -F: tests/functional/hppa/test_seabios.py +F: tests/functional/hppa/ LoongArch Machines ------------------ @@ -3613,7 +3613,9 @@ F: migration/ F: scripts/vmstate-static-checker.py F: tests/functional/migration.py F: tests/functional/*/*migration.py -F: tests/vmstate-static-checker-data/ +F: tests/functional/generic/test_vmstate.py +F: tests/functional/x86_64/test_bad_vmstate.py +F: tests/data/vmstate-static-checker/ F: tests/qtest/migration/ F: tests/qtest/migration-* F: docs/devel/migration/ diff --git a/accel/stubs/tcg-stub.c b/accel/stubs/tcg-stub.c index 3b76b8b..77055e3 100644 --- a/accel/stubs/tcg-stub.c +++ b/accel/stubs/tcg-stub.c @@ -17,8 +17,3 @@ G_NORETURN void cpu_loop_exit(CPUState *cpu) { g_assert_not_reached(); } - -G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc) -{ - g_assert_not_reached(); -} diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c index 87e14bd..2a6aa01 100644 --- a/accel/tcg/cputlb.c +++ b/accel/tcg/cputlb.c @@ -129,7 +129,7 @@ static inline uint64_t tlb_addr_write(const CPUTLBEntry *entry) static inline uintptr_t tlb_index(CPUState *cpu, uintptr_t mmu_idx, vaddr addr) { - uintptr_t size_mask = cpu->neg.tlb.f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS; + uintptr_t size_mask = cpu_tlb_fast(cpu, mmu_idx)->mask >> CPU_TLB_ENTRY_BITS; return (addr >> TARGET_PAGE_BITS) & size_mask; } @@ -138,7 +138,7 @@ static inline uintptr_t tlb_index(CPUState *cpu, uintptr_t mmu_idx, static inline CPUTLBEntry *tlb_entry(CPUState *cpu, uintptr_t mmu_idx, vaddr addr) { - return &cpu->neg.tlb.f[mmu_idx].table[tlb_index(cpu, mmu_idx, addr)]; + return &cpu_tlb_fast(cpu, mmu_idx)->table[tlb_index(cpu, mmu_idx, addr)]; } static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns, @@ -292,7 +292,7 @@ static void tlb_flush_one_mmuidx_locked(CPUState *cpu, int mmu_idx, int64_t now) { CPUTLBDesc *desc = &cpu->neg.tlb.d[mmu_idx]; - CPUTLBDescFast *fast = &cpu->neg.tlb.f[mmu_idx]; + CPUTLBDescFast *fast = cpu_tlb_fast(cpu, mmu_idx); tlb_mmu_resize_locked(desc, fast, now); tlb_mmu_flush_locked(desc, fast); @@ -331,7 +331,7 @@ void tlb_init(CPUState *cpu) cpu->neg.tlb.c.dirty = 0; for (i = 0; i < NB_MMU_MODES; i++) { - tlb_mmu_init(&cpu->neg.tlb.d[i], &cpu->neg.tlb.f[i], now); + tlb_mmu_init(&cpu->neg.tlb.d[i], cpu_tlb_fast(cpu, i), now); } } @@ -342,7 +342,7 @@ void tlb_destroy(CPUState *cpu) qemu_spin_destroy(&cpu->neg.tlb.c.lock); for (i = 0; i < NB_MMU_MODES; i++) { CPUTLBDesc *desc = &cpu->neg.tlb.d[i]; - CPUTLBDescFast *fast = &cpu->neg.tlb.f[i]; + CPUTLBDescFast *fast = cpu_tlb_fast(cpu, i); g_free(fast->table); g_free(desc->fulltlb); @@ -370,8 +370,8 @@ static void flush_all_helper(CPUState *src, run_on_cpu_func fn, static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data) { - uint16_t asked = data.host_int; - uint16_t all_dirty, work, to_clean; + MMUIdxMap asked = data.host_int; + MMUIdxMap all_dirty, work, to_clean; int64_t now = get_clock_realtime(); assert_cpu_is_self(cpu); @@ -408,7 +408,7 @@ static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data) } } -void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap) +void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap) { tlb_debug("mmu_idx: 0x%" PRIx16 "\n", idxmap); @@ -422,7 +422,7 @@ void tlb_flush(CPUState *cpu) tlb_flush_by_mmuidx(cpu, ALL_MMUIDX_BITS); } -void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *src_cpu, uint16_t idxmap) +void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *src_cpu, MMUIdxMap idxmap) { const run_on_cpu_func fn = tlb_flush_by_mmuidx_async_work; @@ -531,7 +531,7 @@ static void tlb_flush_page_locked(CPUState *cpu, int midx, vaddr page) */ static void tlb_flush_page_by_mmuidx_async_0(CPUState *cpu, vaddr addr, - uint16_t idxmap) + MMUIdxMap idxmap) { int mmu_idx; @@ -570,14 +570,14 @@ static void tlb_flush_page_by_mmuidx_async_1(CPUState *cpu, { vaddr addr_and_idxmap = data.target_ptr; vaddr addr = addr_and_idxmap & TARGET_PAGE_MASK; - uint16_t idxmap = addr_and_idxmap & ~TARGET_PAGE_MASK; + MMUIdxMap idxmap = addr_and_idxmap & ~TARGET_PAGE_MASK; tlb_flush_page_by_mmuidx_async_0(cpu, addr, idxmap); } typedef struct { vaddr addr; - uint16_t idxmap; + MMUIdxMap idxmap; } TLBFlushPageByMMUIdxData; /** @@ -599,7 +599,7 @@ static void tlb_flush_page_by_mmuidx_async_2(CPUState *cpu, g_free(d); } -void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, uint16_t idxmap) +void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, MMUIdxMap idxmap) { tlb_debug("addr: %016" VADDR_PRIx " mmu_idx:%" PRIx16 "\n", addr, idxmap); @@ -618,7 +618,7 @@ void tlb_flush_page(CPUState *cpu, vaddr addr) void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *src_cpu, vaddr addr, - uint16_t idxmap) + MMUIdxMap idxmap) { tlb_debug("addr: %016" VADDR_PRIx " mmu_idx:%"PRIx16"\n", addr, idxmap); @@ -667,7 +667,7 @@ static void tlb_flush_range_locked(CPUState *cpu, int midx, unsigned bits) { CPUTLBDesc *d = &cpu->neg.tlb.d[midx]; - CPUTLBDescFast *f = &cpu->neg.tlb.f[midx]; + CPUTLBDescFast *f = cpu_tlb_fast(cpu, midx); vaddr mask = MAKE_64BIT_MASK(0, bits); /* @@ -715,8 +715,8 @@ static void tlb_flush_range_locked(CPUState *cpu, int midx, typedef struct { vaddr addr; vaddr len; - uint16_t idxmap; - uint16_t bits; + MMUIdxMap idxmap; + unsigned bits; } TLBFlushRangeData; static void tlb_flush_range_by_mmuidx_async_0(CPUState *cpu, @@ -766,7 +766,7 @@ static void tlb_flush_range_by_mmuidx_async_1(CPUState *cpu, } void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr, - vaddr len, uint16_t idxmap, + vaddr len, MMUIdxMap idxmap, unsigned bits) { TLBFlushRangeData d; @@ -797,7 +797,7 @@ void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr, } void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr, - uint16_t idxmap, unsigned bits) + MMUIdxMap idxmap, unsigned bits) { tlb_flush_range_by_mmuidx(cpu, addr, TARGET_PAGE_SIZE, idxmap, bits); } @@ -805,7 +805,7 @@ void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr, void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *src_cpu, vaddr addr, vaddr len, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits) { TLBFlushRangeData d, *p; @@ -847,7 +847,7 @@ void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *src_cpu, void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *src_cpu, vaddr addr, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits) { tlb_flush_range_by_mmuidx_all_cpus_synced(src_cpu, addr, TARGET_PAGE_SIZE, @@ -923,7 +923,7 @@ void tlb_reset_dirty(CPUState *cpu, uintptr_t start, uintptr_t length) qemu_spin_lock(&cpu->neg.tlb.c.lock); for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { CPUTLBDesc *desc = &cpu->neg.tlb.d[mmu_idx]; - CPUTLBDescFast *fast = &cpu->neg.tlb.f[mmu_idx]; + CPUTLBDescFast *fast = cpu_tlb_fast(cpu, mmu_idx); unsigned int n = tlb_n_entries(fast); unsigned int i; @@ -1316,7 +1316,7 @@ static bool victim_tlb_hit(CPUState *cpu, size_t mmu_idx, size_t index, if (cmp == page) { /* Found entry in victim tlb, swap tlb and iotlb. */ - CPUTLBEntry tmptlb, *tlb = &cpu->neg.tlb.f[mmu_idx].table[index]; + CPUTLBEntry tmptlb, *tlb = &cpu_tlb_fast(cpu, mmu_idx)->table[index]; qemu_spin_lock(&cpu->neg.tlb.c.lock); copy_tlb_helper_locked(&tmptlb, tlb); diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c index 9920381..1ffcb4b 100644 --- a/accel/tcg/plugin-gen.c +++ b/accel/tcg/plugin-gen.c @@ -102,8 +102,8 @@ static TCGv_i32 gen_cpu_index(void) /* * Optimize when we run with a single vcpu. All values using cpu_index, * including scoreboard index, will be optimized out. - * User-mode calls tb_flush when setting this flag. In system-mode, all - * vcpus are created before generating code. + * User-mode flushes all TBs when setting this flag. + * In system-mode, all vcpus are created before generating code. */ if (!tcg_cflags_has(current_cpu, CF_PARALLEL)) { return tcg_constant_i32(current_cpu->cpu_index); diff --git a/accel/tcg/tb-maint.c b/accel/tcg/tb-maint.c index 0048316..5a8d078 100644 --- a/accel/tcg/tb-maint.c +++ b/accel/tcg/tb-maint.c @@ -36,6 +36,9 @@ #include "internal-common.h" #ifdef CONFIG_USER_ONLY #include "user/page-protection.h" +#define runstate_is_running() true +#else +#include "system/runstate.h" #endif @@ -88,7 +91,10 @@ static IntervalTreeRoot tb_root; static void tb_remove_all(void) { - assert_memory_lock(); + /* + * Only called from tb_flush__exclusive_or_serial, where we have already + * asserted that we're in an exclusive state. + */ memset(&tb_root, 0, sizeof(tb_root)); } @@ -756,17 +762,19 @@ static void tb_remove(TranslationBlock *tb) } #endif /* CONFIG_USER_ONLY */ -/* flush all the translation blocks */ -static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count) +/* + * Flush all the translation blocks. + * Must be called from a context in which no cpus are running, + * e.g. start_exclusive() or vm_stop(). + */ +void tb_flush__exclusive_or_serial(void) { - bool did_flush = false; + CPUState *cpu; - mmap_lock(); - /* If it is already been done on request of another CPU, just retry. */ - if (tb_ctx.tb_flush_count != tb_flush_count.host_int) { - goto done; - } - did_flush = true; + assert(tcg_enabled()); + /* Note that cpu_in_serial_context checks cpu_in_exclusive_context. */ + assert(!runstate_is_running() || + (current_cpu && cpu_in_serial_context(current_cpu))); CPU_FOREACH(cpu) { tcg_flush_jmp_cache(cpu); @@ -778,25 +786,23 @@ static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count) tcg_region_reset_all(); /* XXX: flush processor icache at this point if cache flush is expensive */ qatomic_inc(&tb_ctx.tb_flush_count); + qemu_plugin_flush_cb(); +} -done: - mmap_unlock(); - if (did_flush) { - qemu_plugin_flush_cb(); +static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count) +{ + /* If it is already been done on request of another CPU, just retry. */ + if (tb_ctx.tb_flush_count == tb_flush_count.host_int) { + tb_flush__exclusive_or_serial(); } } -void tb_flush(CPUState *cpu) +void queue_tb_flush(CPUState *cs) { if (tcg_enabled()) { unsigned tb_flush_count = qatomic_read(&tb_ctx.tb_flush_count); - - if (cpu_in_serial_context(cpu)) { - do_tb_flush(cpu, RUN_ON_CPU_HOST_INT(tb_flush_count)); - } else { - async_safe_run_on_cpu(cpu, do_tb_flush, - RUN_ON_CPU_HOST_INT(tb_flush_count)); - } + async_safe_run_on_cpu(cs, do_tb_flush, + RUN_ON_CPU_HOST_INT(tb_flush_count)); } } @@ -836,6 +842,14 @@ static inline void tb_remove_from_jmp_list(TranslationBlock *orig, int n_orig) * We first acquired the lock, and since the destination pointer matches, * we know for sure that @orig is in the jmp list. */ + if (dest == orig) { + /* + * In the case of a TB that links to itself, removing the entry + * from the list means that it won't be present later during + * tb_jmp_unlink -- unlink now. + */ + tb_reset_jump(orig, n_orig); + } pprev = &dest->jmp_list_head; TB_FOR_EACH_JMP(dest, tb, n) { if (tb == orig && n == n_orig) { @@ -1154,7 +1168,6 @@ tb_invalidate_phys_page_range__locked(CPUState *cpu, page_collection_unlock(pages); /* Force execution of one insn next time. */ cpu->cflags_next_tb = 1 | CF_NOIRQ | curr_cflags(cpu); - mmap_unlock(); cpu_loop_exit_noexc(cpu); } } diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c index 5125e1a..18ea0c5 100644 --- a/accel/tcg/tcg-all.c +++ b/accel/tcg/tcg-all.c @@ -38,6 +38,8 @@ #include "qemu/target-info.h" #ifndef CONFIG_USER_ONLY #include "hw/boards.h" +#include "exec/tb-flush.h" +#include "system/runstate.h" #endif #include "accel/accel-ops.h" #include "accel/accel-cpu-ops.h" @@ -82,6 +84,23 @@ static void tcg_accel_instance_init(Object *obj) bool one_insn_per_tb; +#ifndef CONFIG_USER_ONLY +static void tcg_vm_change_state(void *opaque, bool running, RunState state) +{ + if (state == RUN_STATE_RESTORE_VM) { + /* + * loadvm will update the content of RAM, bypassing the usual + * mechanisms that ensure we flush TBs for writes to memory + * we've translated code from, so we must flush all TBs. + * + * vm_stop() has just stopped all cpus, so we are exclusive. + */ + assert(!running); + tb_flush__exclusive_or_serial(); + } +} +#endif + static int tcg_init_machine(AccelState *as, MachineState *ms) { TCGState *s = TCG_STATE(as); @@ -124,6 +143,8 @@ static int tcg_init_machine(AccelState *as, MachineState *ms) default: g_assert_not_reached(); } + + qemu_add_vm_change_state_handler(tcg_vm_change_state, NULL); #endif tcg_allowed = true; diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index d468667..da9d7f1 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -289,7 +289,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu, TCGTBCPUState s) tb = tcg_tb_alloc(tcg_ctx); if (unlikely(!tb)) { /* flush must be done */ - tb_flush(cpu); + if (cpu_in_serial_context(cpu)) { + tb_flush__exclusive_or_serial(); + goto buffer_overflow; + } + queue_tb_flush(cpu); mmap_unlock(); /* Make the execution loop process the flush as soon as possible. */ cpu->exception_index = EXCP_INTERRUPT; diff --git a/gdbstub/system.c b/gdbstub/system.c index 5be0d3c..5221c57 100644 --- a/gdbstub/system.c +++ b/gdbstub/system.c @@ -18,13 +18,11 @@ #include "gdbstub/syscalls.h" #include "gdbstub/commands.h" #include "exec/hwaddr.h" -#include "exec/tb-flush.h" #include "accel/accel-ops.h" #include "accel/accel-cpu-ops.h" #include "system/cpus.h" #include "system/runstate.h" #include "system/replay.h" -#include "system/tcg.h" #include "hw/core/cpu.h" #include "hw/cpu/cluster.h" #include "hw/boards.h" @@ -174,9 +172,6 @@ static void gdb_vm_state_change(void *opaque, bool running, RunState state) } else { trace_gdbstub_hit_break(); } - if (tcg_enabled()) { - tb_flush(cpu); - } ret = GDB_SIGNAL_TRAP; break; case RUN_STATE_PAUSED: diff --git a/gdbstub/user.c b/gdbstub/user.c index 67403e5..2e14ded 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -15,7 +15,6 @@ #include "qemu/sockets.h" #include "qapi/error.h" #include "exec/hwaddr.h" -#include "exec/tb-flush.h" #include "exec/gdbstub.h" #include "gdbstub/commands.h" #include "gdbstub/syscalls.h" @@ -220,7 +219,6 @@ int gdb_handlesig(CPUState *cpu, int sig, const char *reason, void *siginfo, /* disable single step if it was enabled */ cpu_single_step(cpu, 0); - tb_flush(cpu); if (sig != 0) { gdb_set_stop_cpu(cpu); @@ -539,7 +537,6 @@ static void disable_gdbstub(CPUState *thread_cpu) /* no cpu_watchpoint_remove_all for user-mode */ cpu_single_step(cpu, 0); } - tb_flush(thread_cpu); } void gdbserver_fork_end(CPUState *cpu, pid_t pid) diff --git a/hw/core/cpu-system.c b/hw/core/cpu-system.c index 09c928c..f601a08 100644 --- a/hw/core/cpu-system.c +++ b/hw/core/cpu-system.c @@ -23,7 +23,6 @@ #include "system/address-spaces.h" #include "exec/cputlb.h" #include "system/memory.h" -#include "exec/tb-flush.h" #include "qemu/target-info.h" #include "hw/qdev-core.h" #include "hw/qdev-properties.h" @@ -207,14 +206,6 @@ static int cpu_common_post_load(void *opaque, int version_id) cpu_reset_interrupt(cpu, 0x01); tlb_flush(cpu); - - /* - * loadvm has just updated the content of RAM, bypassing the - * usual mechanisms that ensure we flush TBs for writes to - * memory we've translated code from. So we must flush all TBs, - * which will now be stale. - */ - tb_flush(cpu); } return 0; diff --git a/hw/pci-host/astro.c b/hw/pci-host/astro.c index 859e308..1024ede 100644 --- a/hw/pci-host/astro.c +++ b/hw/pci-host/astro.c @@ -424,22 +424,23 @@ static void elroy_reset(DeviceState *dev) } } -static void elroy_pcihost_init(Object *obj) +static void elroy_pcihost_realize(DeviceState *dev, Error **errp) { - ElroyState *s = ELROY_PCI_HOST_BRIDGE(obj); - PCIHostState *phb = PCI_HOST_BRIDGE(obj); - SysBusDevice *sbd = SYS_BUS_DEVICE(obj); + ElroyState *s = ELROY_PCI_HOST_BRIDGE(dev); + PCIHostState *phb = PCI_HOST_BRIDGE(dev); + SysBusDevice *sbd = SYS_BUS_DEVICE(dev); + Object *obj = OBJECT(s); /* Elroy config access from CPU. */ - memory_region_init_io(&s->this_mem, OBJECT(s), &elroy_chip_ops, + memory_region_init_io(&s->this_mem, obj, &elroy_chip_ops, s, "elroy", 0x2000); /* Elroy PCI config. */ - memory_region_init_io(&phb->conf_mem, OBJECT(phb), - &elroy_config_addr_ops, DEVICE(s), + memory_region_init_io(&phb->conf_mem, obj, + &elroy_config_addr_ops, dev, "pci-conf-idx", 8); - memory_region_init_io(&phb->data_mem, OBJECT(phb), - &elroy_config_data_ops, DEVICE(s), + memory_region_init_io(&phb->data_mem, obj, + &elroy_config_data_ops, dev, "pci-conf-data", 8); memory_region_add_subregion(&s->this_mem, 0x40, &phb->conf_mem); @@ -447,8 +448,8 @@ static void elroy_pcihost_init(Object *obj) &phb->data_mem); /* Elroy PCI bus memory. */ - memory_region_init(&s->pci_mmio, OBJECT(s), "pci-mmio", UINT64_MAX); - memory_region_init_io(&s->pci_io, OBJECT(s), &unassigned_io_ops, obj, + memory_region_init(&s->pci_mmio, obj, "pci-mmio", UINT64_MAX); + memory_region_init_io(&s->pci_io, obj, &unassigned_io_ops, obj, "pci-isa-mmio", ((uint32_t) IOS_DIST_BASE_SIZE) / ROPES_PER_IOC); @@ -459,7 +460,7 @@ static void elroy_pcihost_init(Object *obj) sysbus_init_mmio(sbd, &s->this_mem); - qdev_init_gpio_in(DEVICE(obj), elroy_set_irq, ELROY_IRQS); + qdev_init_gpio_in(dev, elroy_set_irq, ELROY_IRQS); } static const VMStateDescription vmstate_elroy = { @@ -487,6 +488,7 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data) DeviceClass *dc = DEVICE_CLASS(klass); device_class_set_legacy_reset(dc, elroy_reset); + dc->realize = elroy_pcihost_realize; dc->vmsd = &vmstate_elroy; dc->user_creatable = false; } @@ -494,7 +496,6 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data) static const TypeInfo elroy_pcihost_info = { .name = TYPE_ELROY_PCI_HOST_BRIDGE, .parent = TYPE_PCI_HOST_BRIDGE, - .instance_init = elroy_pcihost_init, .instance_size = sizeof(ElroyState), .class_init = elroy_pcihost_class_init, }; diff --git a/hw/pci-host/dino.c b/hw/pci-host/dino.c index 11b353b..9240534 100644 --- a/hw/pci-host/dino.c +++ b/hw/pci-host/dino.c @@ -413,43 +413,7 @@ static void dino_pcihost_reset(DeviceState *dev) static void dino_pcihost_realize(DeviceState *dev, Error **errp) { DinoState *s = DINO_PCI_HOST_BRIDGE(dev); - - /* Set up PCI view of memory: Bus master address space. */ - memory_region_init(&s->bm, OBJECT(s), "bm-dino", 4 * GiB); - memory_region_init_alias(&s->bm_ram_alias, OBJECT(s), - "bm-system", s->memory_as, 0, - 0xf0000000 + DINO_MEM_CHUNK_SIZE); - memory_region_init_alias(&s->bm_pci_alias, OBJECT(s), - "bm-pci", &s->pci_mem, - 0xf0000000 + DINO_MEM_CHUNK_SIZE, - 30 * DINO_MEM_CHUNK_SIZE); - memory_region_init_alias(&s->bm_cpu_alias, OBJECT(s), - "bm-cpu", s->memory_as, 0xfff00000, - 0xfffff); - memory_region_add_subregion(&s->bm, 0, - &s->bm_ram_alias); - memory_region_add_subregion(&s->bm, - 0xf0000000 + DINO_MEM_CHUNK_SIZE, - &s->bm_pci_alias); - memory_region_add_subregion(&s->bm, 0xfff00000, - &s->bm_cpu_alias); - - address_space_init(&s->bm_as, &s->bm, "pci-bm"); -} - -static void dino_pcihost_unrealize(DeviceState *dev) -{ - DinoState *s = DINO_PCI_HOST_BRIDGE(dev); - - address_space_destroy(&s->bm_as); -} - -static void dino_pcihost_init(Object *obj) -{ - DinoState *s = DINO_PCI_HOST_BRIDGE(obj); - PCIHostState *phb = PCI_HOST_BRIDGE(obj); - SysBusDevice *sbd = SYS_BUS_DEVICE(obj); - int i; + PCIHostState *phb = PCI_HOST_BRIDGE(dev); /* Dino PCI access from main memory. */ memory_region_init_io(&s->this_mem, OBJECT(s), &dino_chip_ops, @@ -476,7 +440,7 @@ static void dino_pcihost_init(Object *obj) PCI_DEVFN(0, 0), 32, TYPE_PCI_BUS); /* Set up windows into PCI bus memory. */ - for (i = 1; i < 31; i++) { + for (int i = 1; i < 31; i++) { uint32_t addr = 0xf0000000 + i * DINO_MEM_CHUNK_SIZE; char *name = g_strdup_printf("PCI Outbound Window %d", i); memory_region_init_alias(&s->pci_mem_alias[i], OBJECT(s), @@ -487,9 +451,38 @@ static void dino_pcihost_init(Object *obj) pci_setup_iommu(phb->bus, &dino_iommu_ops, s); - sysbus_init_mmio(sbd, &s->this_mem); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->this_mem); - qdev_init_gpio_in(DEVICE(obj), dino_set_irq, DINO_IRQS); + qdev_init_gpio_in(dev, dino_set_irq, DINO_IRQS); + + /* Set up PCI view of memory: Bus master address space. */ + memory_region_init(&s->bm, OBJECT(s), "bm-dino", 4 * GiB); + memory_region_init_alias(&s->bm_ram_alias, OBJECT(s), + "bm-system", s->memory_as, 0, + 0xf0000000 + DINO_MEM_CHUNK_SIZE); + memory_region_init_alias(&s->bm_pci_alias, OBJECT(s), + "bm-pci", &s->pci_mem, + 0xf0000000 + DINO_MEM_CHUNK_SIZE, + 30 * DINO_MEM_CHUNK_SIZE); + memory_region_init_alias(&s->bm_cpu_alias, OBJECT(s), + "bm-cpu", s->memory_as, 0xfff00000, + 0xfffff); + memory_region_add_subregion(&s->bm, 0, + &s->bm_ram_alias); + memory_region_add_subregion(&s->bm, + 0xf0000000 + DINO_MEM_CHUNK_SIZE, + &s->bm_pci_alias); + memory_region_add_subregion(&s->bm, 0xfff00000, + &s->bm_cpu_alias); + + address_space_init(&s->bm_as, &s->bm, "pci-bm"); +} + +static void dino_pcihost_unrealize(DeviceState *dev) +{ + DinoState *s = DINO_PCI_HOST_BRIDGE(dev); + + address_space_destroy(&s->bm_as); } static const Property dino_pcihost_properties[] = { @@ -511,7 +504,6 @@ static void dino_pcihost_class_init(ObjectClass *klass, const void *data) static const TypeInfo dino_pcihost_info = { .name = TYPE_DINO_PCI_HOST_BRIDGE, .parent = TYPE_PCI_HOST_BRIDGE, - .instance_init = dino_pcihost_init, .instance_size = sizeof(DinoState), .class_init = dino_pcihost_class_init, }; diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index c594d4b..8c1e0a4 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -8,7 +8,7 @@ #include "qemu/main-loop.h" #include "qemu/module.h" #include "qemu/error-report.h" -#include "exec/tb-flush.h" +#include "exec/translation-block.h" #include "exec/target_page.h" #include "helper_regs.h" #include "hw/ppc/ppc.h" @@ -301,7 +301,7 @@ static target_ulong h_page_init(PowerPCCPU *cpu, SpaprMachineState *spapr, if (kvm_enabled()) { kvmppc_icbi_range(cpu, pdst, len); } else if (tcg_enabled()) { - tb_flush(CPU(cpu)); + tb_invalidate_phys_range(CPU(cpu), dst, dst + len - 1); } else { g_assert_not_reached(); } diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 9b658a3..f373781 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -221,9 +221,9 @@ static inline bool cpu_loop_exit_requested(CPUState *cpu) G_NORETURN void cpu_loop_exit_noexc(CPUState *cpu); G_NORETURN void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc); +G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc); #endif /* CONFIG_TCG */ G_NORETURN void cpu_loop_exit(CPUState *cpu); -G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc); /* accel/tcg/cpu-exec.c */ int cpu_exec(CPUState *cpu); diff --git a/include/exec/cputlb.h b/include/exec/cputlb.h index 03ed7e2..9bec0e7 100644 --- a/include/exec/cputlb.h +++ b/include/exec/cputlb.h @@ -150,7 +150,7 @@ void tlb_flush_all_cpus_synced(CPUState *src_cpu); * MMU indexes. */ void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, - uint16_t idxmap); + MMUIdxMap idxmap); /** * tlb_flush_page_by_mmuidx_all_cpus_synced: @@ -165,7 +165,7 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, * translations using the flushed TLBs. */ void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, - uint16_t idxmap); + MMUIdxMap idxmap); /** * tlb_flush_by_mmuidx: @@ -176,7 +176,7 @@ void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, * Flush all entries from the TLB of the specified CPU, for the specified * MMU indexes. */ -void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap); +void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap); /** * tlb_flush_by_mmuidx_all_cpus_synced: @@ -189,7 +189,7 @@ void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap); * When this function returns, no CPUs will subsequently perform * translations using the flushed TLBs. */ -void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, uint16_t idxmap); +void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, MMUIdxMap idxmap); /** * tlb_flush_page_bits_by_mmuidx @@ -201,11 +201,11 @@ void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, uint16_t idxmap); * Similar to tlb_flush_page_mask, but with a bitmap of indexes. */ void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr, - uint16_t idxmap, unsigned bits); + MMUIdxMap idxmap, unsigned bits); /* Similarly, with broadcast and syncing. */ void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits); /** @@ -220,14 +220,14 @@ void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, * comparing only the low @bits worth of each virtual page. */ void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr, - vaddr len, uint16_t idxmap, + vaddr len, MMUIdxMap idxmap, unsigned bits); /* Similarly, with broadcast and syncing. */ void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, vaddr len, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits); #else static inline void tlb_flush_page(CPUState *cpu, vaddr addr) @@ -243,42 +243,42 @@ static inline void tlb_flush_all_cpus_synced(CPUState *src_cpu) { } static inline void tlb_flush_page_by_mmuidx(CPUState *cpu, - vaddr addr, uint16_t idxmap) + vaddr addr, MMUIdxMap idxmap) { } -static inline void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap) +static inline void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap) { } static inline void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, - uint16_t idxmap) + MMUIdxMap idxmap) { } static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, - uint16_t idxmap) + MMUIdxMap idxmap) { } static inline void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits) { } static inline void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, - uint16_t idxmap, unsigned bits) + MMUIdxMap idxmap, unsigned bits) { } static inline void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr, - vaddr len, uint16_t idxmap, + vaddr len, MMUIdxMap idxmap, unsigned bits) { } static inline void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr, vaddr len, - uint16_t idxmap, + MMUIdxMap idxmap, unsigned bits) { } diff --git a/include/exec/tb-flush.h b/include/exec/tb-flush.h index 142c240..e971d4b 100644 --- a/include/exec/tb-flush.h +++ b/include/exec/tb-flush.h @@ -9,19 +9,29 @@ #define _TB_FLUSH_H_ /** - * tb_flush() - flush all translation blocks - * @cs: CPUState (must be valid, but treated as anonymous pointer) + * tb_flush__exclusive_or_serial() * - * Used to flush all the translation blocks in the system. Sometimes - * it is simpler to flush everything than work out which individual - * translations are now invalid and ensure they are not called - * anymore. + * Used to flush all the translation blocks in the system. Mostly this is + * used to empty the code generation buffer after it is full. Sometimes it + * is used when it is simpler to flush everything than work out which + * individual translations are now invalid. * - * tb_flush() takes care of running the flush in an exclusive context - * if it is not already running in one. This means no guest code will - * run until this complete. + * Must be called from an exclusive or serial context, e.g. start_exclusive, + * vm_stop, or when there is only one vcpu. Note that start_exclusive cannot + * be called from within the cpu run loop, so this cannot be called from + * within target code. */ -void tb_flush(CPUState *cs); +void tb_flush__exclusive_or_serial(void); + +/** + * queue_tb_flush() - add flush to the cpu work queue + * @cs: CPUState + * + * Flush all translation blocks the next time @cs processes the work queue. + * This should generally be followed by cpu_loop_exit(), so that the work + * queue is processed promptly. + */ +void queue_tb_flush(CPUState *cs); void tcg_flush_jmp_cache(CPUState *cs); diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index fb788ca..c9f40c2 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -198,10 +198,10 @@ struct CPUClass { }; /* - * Fix the number of mmu modes to 16, which is also the maximum - * supported by the softmmu tlb api. + * Fix the number of mmu modes to 16. */ #define NB_MMU_MODES 16 +typedef uint16_t MMUIdxMap; /* Use a fully associative victim tlb of 8 entries. */ #define CPU_VTLB_SIZE 8 @@ -306,7 +306,7 @@ typedef struct CPUTLBCommon { * mmu_idx N since the last time that mmu_idx was flushed. * Protected by tlb_c.lock. */ - uint16_t dirty; + MMUIdxMap dirty; /* * Statistics. These are not lock protected, but are read and * written atomically. This allows the monitor to print a snapshot @@ -602,6 +602,22 @@ static inline CPUArchState *cpu_env(CPUState *cpu) return (CPUArchState *)(cpu + 1); } +#ifdef CONFIG_TCG +/* + * Invert the index order of the CPUTLBDescFast array so that lower + * mmu_idx have offsets from env with smaller magnitude. + */ +static inline int mmuidx_to_fast_index(int mmu_idx) +{ + return NB_MMU_MODES - 1 - mmu_idx; +} + +static inline CPUTLBDescFast *cpu_tlb_fast(CPUState *cpu, int mmu_idx) +{ + return &cpu->neg.tlb.f[mmuidx_to_fast_index(mmu_idx)]; +} +#endif + typedef QTAILQ_HEAD(CPUTailQ, CPUState) CPUTailQ; extern CPUTailQ cpus_queue; diff --git a/linux-user/aarch64/vdso-be.so b/linux-user/aarch64/vdso-be.so Binary files differindex d43c3b1..4089838 100755 --- a/linux-user/aarch64/vdso-be.so +++ b/linux-user/aarch64/vdso-be.so diff --git a/linux-user/aarch64/vdso-le.so b/linux-user/aarch64/vdso-le.so Binary files differindex aaedc9d..2408028 100755 --- a/linux-user/aarch64/vdso-le.so +++ b/linux-user/aarch64/vdso-le.so diff --git a/linux-user/aarch64/vdso.S b/linux-user/aarch64/vdso.S index a0ac148..59dd94d 100644 --- a/linux-user/aarch64/vdso.S +++ b/linux-user/aarch64/vdso.S @@ -71,5 +71,7 @@ vdso_syscall __kernel_clock_getres, __NR_clock_getres __kernel_rt_sigreturn: /* No BTI C insn here -- we arrive via RET. */ mov x8, #__NR_rt_sigreturn +sigreturn_region_start: svc #0 +sigreturn_region_end: endf __kernel_rt_sigreturn diff --git a/linux-user/alpha/cpu_loop.c b/linux-user/alpha/cpu_loop.c index bb8346b..f93597c 100644 --- a/linux-user/alpha/cpu_loop.c +++ b/linux-user/alpha/cpu_loop.c @@ -94,11 +94,6 @@ void cpu_loop(CPUAlphaState *env) break; case 0x86: /* IMB */ - /* ??? We can probably elide the code using page_unprotect - that is checking for self-modifying code. Instead we - could simply call tb_flush here. Until we work out the - changes required to turn off the extra write protection, - this can be a no-op. */ break; case 0x9E: /* RDUNIQUE */ diff --git a/linux-user/arm/vdso-be32.so b/linux-user/arm/vdso-be32.so Binary files differindex b896d3d..6d71cd9 100755 --- a/linux-user/arm/vdso-be32.so +++ b/linux-user/arm/vdso-be32.so diff --git a/linux-user/arm/vdso-be8.so b/linux-user/arm/vdso-be8.so Binary files differindex 784b7bd..6446a96 100755 --- a/linux-user/arm/vdso-be8.so +++ b/linux-user/arm/vdso-be8.so diff --git a/linux-user/arm/vdso-le.so b/linux-user/arm/vdso-le.so Binary files differindex 38d3d51..d34e577 100755 --- a/linux-user/arm/vdso-le.so +++ b/linux-user/arm/vdso-le.so diff --git a/linux-user/arm/vdso.S b/linux-user/arm/vdso.S index b3bb649..d84d964 100644 --- a/linux-user/arm/vdso.S +++ b/linux-user/arm/vdso.S @@ -140,6 +140,7 @@ SYSCALL __vdso_gettimeofday, __NR_gettimeofday .balign 16 sigreturn_codes: +sigreturn_region_start: /* [EO]ABI sigreturn */ slot 0 raw_syscall __NR_sigreturn @@ -172,3 +173,4 @@ sigreturn_codes: .balign 16 endf sigreturn_codes +sigreturn_region_end: diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 26c090c..1370ec5 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1659,6 +1659,11 @@ static void load_elf_vdso(struct image_info *info, const VdsoImageInfo *vdso) if (vdso->rt_sigreturn_ofs) { default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs; } + if (vdso->sigreturn_region_start_ofs) { + vdso_sigreturn_region_start = + load_addr + vdso->sigreturn_region_start_ofs; + vdso_sigreturn_region_end = load_addr + vdso->sigreturn_region_end_ofs; + } /* Remove write from VDSO segment. */ target_mprotect(info->start_data, info->end_data - info->start_data, @@ -1969,6 +1974,8 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) setup_sigtramp(tramp_page); target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC); + vdso_sigreturn_region_start = tramp_page; + vdso_sigreturn_region_end = tramp_page + TARGET_PAGE_SIZE; } bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr, info, diff --git a/linux-user/gen-vdso-elfn.c.inc b/linux-user/gen-vdso-elfn.c.inc index b47019e..c2677a1 100644 --- a/linux-user/gen-vdso-elfn.c.inc +++ b/linux-user/gen-vdso-elfn.c.inc @@ -84,9 +84,12 @@ static void elfN(search_symtab)(ElfN(Shdr) *shdr, unsigned sym_idx, if (sigreturn_sym && strcmp(sigreturn_sym, name) == 0) { sigreturn_addr = sym.st_value; - } - if (rt_sigreturn_sym && strcmp(rt_sigreturn_sym, name) == 0) { + } else if (rt_sigreturn_sym && strcmp(rt_sigreturn_sym, name) == 0) { rt_sigreturn_addr = sym.st_value; + } else if (strcmp("sigreturn_region_start", name) == 0) { + sigreturn_region_start_addr = sym.st_value; + } else if (strcmp("sigreturn_region_end", name) == 0) { + sigreturn_region_end_addr = sym.st_value; } } } diff --git a/linux-user/gen-vdso.c b/linux-user/gen-vdso.c index aeaa927..d6a2cda 100644 --- a/linux-user/gen-vdso.c +++ b/linux-user/gen-vdso.c @@ -36,6 +36,8 @@ static const char *rt_sigreturn_sym; static unsigned sigreturn_addr; static unsigned rt_sigreturn_addr; +static unsigned sigreturn_region_start_addr; +static unsigned sigreturn_region_end_addr; #define N 32 #define elfN(x) elf32_##x @@ -215,6 +217,10 @@ int main(int argc, char **argv) fprintf(outf, " .reloc_count = ARRAY_SIZE(%s_relocs),\n", prefix); fprintf(outf, " .sigreturn_ofs = 0x%x,\n", sigreturn_addr); fprintf(outf, " .rt_sigreturn_ofs = 0x%x,\n", rt_sigreturn_addr); + fprintf(outf, " .sigreturn_region_start_ofs = 0x%x,\n", + sigreturn_region_start_addr); + fprintf(outf, " .sigreturn_region_end_ofs = 0x%x,\n", + sigreturn_region_end_addr); fprintf(outf, "};\n"); ret = EXIT_SUCCESS; diff --git a/linux-user/hppa/vdso.S b/linux-user/hppa/vdso.S index 5be14d2..a6f8da2 100644 --- a/linux-user/hppa/vdso.S +++ b/linux-user/hppa/vdso.S @@ -156,8 +156,10 @@ __kernel_sigtramp_rt: ldi 0, %r25 ldi __NR_rt_sigreturn, %r20 +sigreturn_region_start: be,l 0x100(%sr2, %r0), %sr0, %r31 nop +sigreturn_region_end: .cfi_endproc .size __kernel_sigtramp_rt, . - __kernel_sigtramp_rt diff --git a/linux-user/hppa/vdso.so b/linux-user/hppa/vdso.so Binary files differindex e1ddd70..68baf80 100755 --- a/linux-user/hppa/vdso.so +++ b/linux-user/hppa/vdso.so diff --git a/linux-user/i386/vdso.S b/linux-user/i386/vdso.S index e7a1f33..8df77b5 100644 --- a/linux-user/i386/vdso.S +++ b/linux-user/i386/vdso.S @@ -114,6 +114,7 @@ vdso_syscall3 __vdso_getcpu, __NR_gettimeofday */ nop +sigreturn_region_start: __kernel_sigreturn: popl %eax /* pop sig */ .cfi_adjust_cfa_offset -4 @@ -128,6 +129,7 @@ __kernel_rt_sigreturn: movl $__NR_rt_sigreturn, %eax int $0x80 endf __kernel_rt_sigreturn +sigreturn_region_end: .cfi_endproc diff --git a/linux-user/i386/vdso.so b/linux-user/i386/vdso.so Binary files differindex bdece5d..e01c381 100755 --- a/linux-user/i386/vdso.so +++ b/linux-user/i386/vdso.so diff --git a/linux-user/loader.h b/linux-user/loader.h index e42b8fa..da9ad28 100644 --- a/linux-user/loader.h +++ b/linux-user/loader.h @@ -117,6 +117,8 @@ typedef struct { unsigned reloc_count; unsigned sigreturn_ofs; unsigned rt_sigreturn_ofs; + unsigned sigreturn_region_start_ofs; + unsigned sigreturn_region_end_ofs; } VdsoImageInfo; /* Note that both Elf32_Word and Elf64_Word are uint32_t. */ diff --git a/linux-user/loongarch64/vdso.S b/linux-user/loongarch64/vdso.S index 780a5fd..2409d95 100644 --- a/linux-user/loongarch64/vdso.S +++ b/linux-user/loongarch64/vdso.S @@ -125,6 +125,8 @@ vdso_syscall __vdso_getcpu, __NR_getcpu __vdso_rt_sigreturn: li.w $a7, __NR_rt_sigreturn +sigreturn_region_start: syscall 0 +sigreturn_region_end: .cfi_endproc endf __vdso_rt_sigreturn diff --git a/linux-user/loongarch64/vdso.so b/linux-user/loongarch64/vdso.so Binary files differindex 7c2de6c..3704834 100755 --- a/linux-user/loongarch64/vdso.so +++ b/linux-user/loongarch64/vdso.so diff --git a/linux-user/main.c b/linux-user/main.c index 4ddfc9a..db751c0 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -228,6 +228,8 @@ void init_task_state(TaskState *ts) ts->start_boottime += bt.tv_nsec * (uint64_t) ticks_per_sec / NANOSECONDS_PER_SECOND; } + + ts->sys_dispatch_len = -1; } CPUArchState *cpu_copy(CPUArchState *env) diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 002e1e6..847092a 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -22,8 +22,6 @@ #include "exec/log.h" #include "exec/page-protection.h" #include "exec/mmap-lock.h" -#include "exec/tb-flush.h" -#include "exec/translation-block.h" #include "qemu.h" #include "user/page-protection.h" #include "user-internals.h" @@ -1007,11 +1005,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int target_prot, * be atomic with respect to an external process. */ if (ret != -1 && (flags & MAP_TYPE) != MAP_PRIVATE) { - CPUState *cpu = thread_cpu; - if (!tcg_cflags_has(cpu, CF_PARALLEL)) { - tcg_cflags_set(cpu, CF_PARALLEL); - tb_flush(cpu); - } + begin_parallel_context(thread_cpu); } return ret; @@ -1448,10 +1442,7 @@ abi_ulong target_shmat(CPUArchState *cpu_env, int shmid, * supported by the host -- anything that requires EXCP_ATOMIC will not * be atomic with respect to an external process. */ - if (!tcg_cflags_has(cpu, CF_PARALLEL)) { - tcg_cflags_set(cpu, CF_PARALLEL); - tb_flush(cpu); - } + begin_parallel_context(cpu); if (qemu_loglevel_mask(CPU_LOG_PAGE)) { FILE *f = qemu_log_trylock(); diff --git a/linux-user/ppc/vdso-32.so b/linux-user/ppc/vdso-32.so Binary files differindex 0dc55e0..0347605 100755 --- a/linux-user/ppc/vdso-32.so +++ b/linux-user/ppc/vdso-32.so diff --git a/linux-user/ppc/vdso-64.so b/linux-user/ppc/vdso-64.so Binary files differindex ac1ab25..b89f2a0 100755 --- a/linux-user/ppc/vdso-64.so +++ b/linux-user/ppc/vdso-64.so diff --git a/linux-user/ppc/vdso-64le.so b/linux-user/ppc/vdso-64le.so Binary files differindex 424abb4..22499d2 100755 --- a/linux-user/ppc/vdso-64le.so +++ b/linux-user/ppc/vdso-64le.so diff --git a/linux-user/ppc/vdso.S b/linux-user/ppc/vdso.S index 2e79ea9..e9256a2 100644 --- a/linux-user/ppc/vdso.S +++ b/linux-user/ppc/vdso.S @@ -220,6 +220,7 @@ endf __kernel_sync_dicache nop +sigreturn_region_start: __kernel_sigtramp_rt: raw_syscall __NR_rt_sigreturn endf __kernel_sigtramp_rt @@ -235,5 +236,6 @@ __kernel_sigtramp32: raw_syscall __NR_sigreturn endf __kernel_sigtramp32 #endif +sigreturn_region_end: .cfi_endproc diff --git a/linux-user/qemu.h b/linux-user/qemu.h index e4dca0c..cabb7bd 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -155,6 +155,11 @@ struct TaskState { /* This thread's sigaltstack, if it has one */ struct target_sigaltstack sigaltstack_used; + /* This thread's SYSCALL_USER_DISPATCH state, len=~0 means disabled */ + vaddr sys_dispatch; + vaddr sys_dispatch_selector; + abi_ulong sys_dispatch_len; + /* Start time of task after system boot in clock ticks */ uint64_t start_boottime; }; diff --git a/linux-user/riscv/vdso-32.so b/linux-user/riscv/vdso-32.so Binary files differindex c2ce2a4..4818a99 100755 --- a/linux-user/riscv/vdso-32.so +++ b/linux-user/riscv/vdso-32.so diff --git a/linux-user/riscv/vdso-64.so b/linux-user/riscv/vdso-64.so Binary files differindex ae49f5b..cc6f7e9 100755 --- a/linux-user/riscv/vdso-64.so +++ b/linux-user/riscv/vdso-64.so diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S index c372752..1d780db 100644 --- a/linux-user/riscv/vdso.S +++ b/linux-user/riscv/vdso.S @@ -181,7 +181,9 @@ endf __vdso_flush_icache nop __vdso_rt_sigreturn: +sigreturn_region_start: raw_syscall __NR_rt_sigreturn +sigreturn_region_end: endf __vdso_rt_sigreturn .cfi_endproc diff --git a/linux-user/s390x/vdso.S b/linux-user/s390x/vdso.S index 3332492..c60e9ed 100644 --- a/linux-user/s390x/vdso.S +++ b/linux-user/s390x/vdso.S @@ -52,6 +52,7 @@ vdso_syscall __kernel_getcpu, __NR_getcpu * by all users. Without it we get the fallback signal frame handling. */ +sigreturn_region_start: __kernel_sigreturn: raw_syscall __NR_sigreturn endf __kernel_sigreturn @@ -59,3 +60,4 @@ endf __kernel_sigreturn __kernel_rt_sigreturn: raw_syscall __NR_rt_sigreturn endf __kernel_rt_sigreturn +sigreturn_region_end: diff --git a/linux-user/s390x/vdso.so b/linux-user/s390x/vdso.so Binary files differindex 64130f6..a669a6b 100755 --- a/linux-user/s390x/vdso.so +++ b/linux-user/s390x/vdso.so diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h index 196d240..8a44714 100644 --- a/linux-user/signal-common.h +++ b/linux-user/signal-common.h @@ -25,6 +25,13 @@ /* Fallback addresses into sigtramp page. */ extern abi_ulong default_sigreturn; extern abi_ulong default_rt_sigreturn; +extern abi_ulong vdso_sigreturn_region_start; +extern abi_ulong vdso_sigreturn_region_end; + +static inline bool is_vdso_sigreturn(abi_ulong pc) +{ + return pc >= vdso_sigreturn_region_start && pc < vdso_sigreturn_region_end; +} void setup_sigtramp(abi_ulong tramp_page); diff --git a/linux-user/signal.c b/linux-user/signal.c index cd0e739..804096b 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -50,6 +50,8 @@ static void host_signal_handler(int host_signum, siginfo_t *info, /* Fallback addresses into sigtramp page. */ abi_ulong default_sigreturn; abi_ulong default_rt_sigreturn; +abi_ulong vdso_sigreturn_region_start; +abi_ulong vdso_sigreturn_region_end; /* * System includes define _NSIG as SIGRTMAX + 1, but qemu (like the kernel) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 91360a0..1a5f2a0 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -27,8 +27,6 @@ #include "target_mman.h" #include "exec/page-protection.h" #include "exec/mmap-lock.h" -#include "exec/tb-flush.h" -#include "exec/translation-block.h" #include <elf.h> #include <endian.h> #include <grp.h> @@ -6344,6 +6342,10 @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr) #endif #ifndef PR_SET_SYSCALL_USER_DISPATCH # define PR_SET_SYSCALL_USER_DISPATCH 59 +# define PR_SYS_DISPATCH_OFF 0 +# define PR_SYS_DISPATCH_ON 1 +# define SYSCALL_DISPATCH_FILTER_ALLOW 0 +# define SYSCALL_DISPATCH_FILTER_BLOCK 1 #endif #ifndef PR_SME_SET_VL # define PR_SME_SET_VL 63 @@ -6398,6 +6400,36 @@ static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2) #define do_prctl_sme_set_vl do_prctl_inval1 #endif +static abi_long do_prctl_syscall_user_dispatch(CPUArchState *env, + abi_ulong arg2, abi_ulong arg3, + abi_ulong arg4, abi_ulong arg5) +{ + CPUState *cpu = env_cpu(env); + TaskState *ts = get_task_state(cpu); + + switch (arg2) { + case PR_SYS_DISPATCH_OFF: + if (arg3 || arg4 || arg5) { + return -TARGET_EINVAL; + } + ts->sys_dispatch_len = -1; + return 0; + case PR_SYS_DISPATCH_ON: + if (arg3 && arg3 + arg4 <= arg3) { + return -TARGET_EINVAL; + } + if (arg5 && !access_ok(cpu, VERIFY_READ, arg5, 1)) { + return -TARGET_EFAULT; + } + ts->sys_dispatch = arg3; + ts->sys_dispatch_len = arg4; + ts->sys_dispatch_selector = arg5; + return 0; + default: + return -TARGET_EINVAL; + } +} + static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5) { @@ -6473,6 +6505,9 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, case PR_SET_UNALIGN: return do_prctl_set_unalign(env, arg2); + case PR_SET_SYSCALL_USER_DISPATCH: + return do_prctl_syscall_user_dispatch(env, arg2, arg3, arg4, arg5); + case PR_CAP_AMBIENT: case PR_CAPBSET_READ: case PR_CAPBSET_DROP: @@ -6527,7 +6562,6 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, case PR_SET_MM: case PR_GET_SECCOMP: case PR_SET_SECCOMP: - case PR_SET_SYSCALL_USER_DISPATCH: case PR_GET_THP_DISABLE: case PR_SET_THP_DISABLE: case PR_GET_TSC: @@ -6631,10 +6665,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp, * generate code for parallel execution and flush old translations. * Do this now so that the copy gets CF_PARALLEL too. */ - if (!tcg_cflags_has(cpu, CF_PARALLEL)) { - tcg_cflags_set(cpu, CF_PARALLEL); - tb_flush(cpu); - } + begin_parallel_context(cpu); /* we create a new CPU instance. */ new_env = cpu_copy(env); @@ -13897,12 +13928,46 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, return ret; } +static bool sys_dispatch(CPUState *cpu, TaskState *ts) +{ + abi_ptr pc; + + if (likely(ts->sys_dispatch_len == -1)) { + return false; + } + + pc = cpu->cc->get_pc(cpu); + if (likely(pc - ts->sys_dispatch < ts->sys_dispatch_len)) { + return false; + } + if (unlikely(is_vdso_sigreturn(pc))) { + return false; + } + if (likely(ts->sys_dispatch_selector)) { + uint8_t sb; + if (get_user_u8(sb, ts->sys_dispatch_selector)) { + force_sig(TARGET_SIGSEGV); + return true; + } + if (likely(sb == SYSCALL_DISPATCH_FILTER_ALLOW)) { + return false; + } + if (unlikely(sb != SYSCALL_DISPATCH_FILTER_BLOCK)) { + force_sig(TARGET_SIGSYS); + return true; + } + } + force_sig_fault(TARGET_SIGSYS, TARGET_SYS_USER_DISPATCH, pc); + return true; +} + abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long arg7, abi_long arg8) { CPUState *cpu = env_cpu(cpu_env); + TaskState *ts = get_task_state(cpu); abi_long ret; #ifdef DEBUG_ERESTARTSYS @@ -13919,6 +13984,10 @@ abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1, } #endif + if (sys_dispatch(cpu, ts)) { + return -QEMU_ESIGRETURN; + } + record_syscall_start(cpu, num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index df26a2d..cd9ff70 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -690,6 +690,12 @@ typedef struct target_siginfo { #define TARGET_TRAP_UNK (5) /* undiagnosed trap */ /* + * SIGSYS si_codes + */ +#define TARGET_SYS_SECCOMP (1) /* seccomp triggered */ +#define TARGET_SYS_USER_DISPATCH (2) /* syscall user dispatch triggered */ + +/* * SIGEMT si_codes */ #define TARGET_EMT_TAGOVF 1 /* tag overflow */ diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h index 691b9a1..7099349 100644 --- a/linux-user/user-internals.h +++ b/linux-user/user-internals.h @@ -20,6 +20,8 @@ #include "user/thunk.h" #include "qemu/log.h" +#include "exec/tb-flush.h" +#include "exec/translation-block.h" extern char *exec_path; void init_task_state(TaskState *ts); @@ -172,6 +174,20 @@ static inline int regpairs_aligned(CPUArchState *cpu_env, int num) { return 0; } */ void preexit_cleanup(CPUArchState *env, int code); +/** + * begin_parallel_context + * @cs: the CPU context + * + * Called when starting the second vcpu, or joining shared memory. + */ +static inline void begin_parallel_context(CPUState *cs) +{ + if (!tcg_cflags_has(cs, CF_PARALLEL)) { + tb_flush__exclusive_or_serial(); + tcg_cflags_set(cs, CF_PARALLEL); + } +} + /* * Include target-specific struct and function definitions; * they may need access to the target-independent structures diff --git a/plugins/core.c b/plugins/core.c index c6e9ef1..ead09fd 100644 --- a/plugins/core.c +++ b/plugins/core.c @@ -248,7 +248,7 @@ static void plugin_grow_scoreboards__locked(CPUState *cpu) } plugin.scoreboard_alloc_size = scoreboard_size; /* force all tb to be flushed, as scoreboard pointers were changed. */ - tb_flush(cpu); + tb_flush__exclusive_or_serial(); } end_exclusive(); } @@ -684,8 +684,6 @@ void qemu_plugin_user_exit(void) * with the one in fork_start(). That is: * - start_exclusive(), which acquires qemu_cpu_list_lock, * must be called before acquiring plugin.lock. - * - tb_flush(), which acquires mmap_lock(), must be called - * while plugin.lock is not held. */ start_exclusive(); @@ -705,7 +703,7 @@ void qemu_plugin_user_exit(void) } qemu_rec_mutex_unlock(&plugin.lock); - tb_flush(current_cpu); + tb_flush__exclusive_or_serial(); end_exclusive(); /* now it's safe to handle the exit case */ diff --git a/plugins/loader.c b/plugins/loader.c index 8f0d75c..ba10eba 100644 --- a/plugins/loader.c +++ b/plugins/loader.c @@ -377,8 +377,7 @@ static void plugin_flush_destroy(CPUState *cpu, run_on_cpu_data arg) { struct qemu_plugin_reset_data *data = arg.host_ptr; - g_assert(cpu_in_exclusive_context(cpu)); - tb_flush(cpu); + tb_flush__exclusive_or_serial(); plugin_reset_destroy(data); } diff --git a/target/alpha/helper.h b/target/alpha/helper.h index d60f208..788d2fb 100644 --- a/target/alpha/helper.h +++ b/target/alpha/helper.h @@ -90,7 +90,6 @@ DEF_HELPER_FLAGS_2(ieee_input_s, TCG_CALL_NO_WG, void, env, i64) #if !defined (CONFIG_USER_ONLY) DEF_HELPER_FLAGS_1(tbia, TCG_CALL_NO_RWG, void, env) DEF_HELPER_FLAGS_2(tbis, TCG_CALL_NO_RWG, void, env, i64) -DEF_HELPER_FLAGS_1(tb_flush, TCG_CALL_NO_RWG, void, env) DEF_HELPER_1(halt, void, i64) diff --git a/target/alpha/sys_helper.c b/target/alpha/sys_helper.c index 51e3254..87e3760 100644 --- a/target/alpha/sys_helper.c +++ b/target/alpha/sys_helper.c @@ -20,7 +20,6 @@ #include "qemu/osdep.h" #include "cpu.h" #include "exec/cputlb.h" -#include "exec/tb-flush.h" #include "exec/helper-proto.h" #include "system/runstate.h" #include "system/system.h" @@ -38,11 +37,6 @@ void helper_tbis(CPUAlphaState *env, uint64_t p) tlb_flush_page(env_cpu(env), p); } -void helper_tb_flush(CPUAlphaState *env) -{ - tb_flush(env_cpu(env)); -} - void helper_halt(uint64_t restart) { if (restart) { diff --git a/target/alpha/translate.c b/target/alpha/translate.c index cebab03..f11b382 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -48,8 +48,6 @@ struct DisasContext { #ifdef CONFIG_USER_ONLY MemOp unalign; -#else - uint64_t palbr; #endif uint32_t tbflags; int mem_idx; @@ -1155,7 +1153,6 @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode) #else { TCGv tmp = tcg_temp_new(); - uint64_t entry; gen_pc_disp(ctx, tmp, 0); if (ctx->tbflags & ENV_FLAG_PAL_MODE) { @@ -1165,12 +1162,11 @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode) } tcg_gen_st_i64(tmp, tcg_env, offsetof(CPUAlphaState, exc_addr)); - entry = ctx->palbr; - entry += (palcode & 0x80 - ? 0x2000 + (palcode - 0x80) * 64 - : 0x1000 + palcode * 64); - - tcg_gen_movi_i64(cpu_pc, entry); + tcg_gen_ld_i64(cpu_pc, tcg_env, offsetof(CPUAlphaState, palbr)); + tcg_gen_addi_i64(cpu_pc, cpu_pc, + palcode & 0x80 + ? 0x2000 + (palcode - 0x80) * 64 + : 0x1000 + palcode * 64); return DISAS_PC_UPDATED; } #endif @@ -1292,11 +1288,7 @@ static DisasJumpType gen_mtpr(DisasContext *ctx, TCGv vb, int regno) case 7: /* PALBR */ tcg_gen_st_i64(vb, tcg_env, offsetof(CPUAlphaState, palbr)); - /* Changing the PAL base register implies un-chaining all of the TBs - that ended with a CALL_PAL. Since the base register usually only - changes during boot, flushing everything works well. */ - gen_helper_tb_flush(tcg_env); - return DISAS_PC_STALE; + break; case 32 ... 39: /* Accessing the "non-shadow" general registers. */ @@ -2874,7 +2866,6 @@ static void alpha_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu) ctx->ir = cpu_std_ir; ctx->unalign = (ctx->tbflags & TB_FLAG_UNALIGN ? MO_UNALN : MO_ALIGN); #else - ctx->palbr = env->palbr; ctx->ir = (ctx->tbflags & ENV_FLAG_PAL_MODE ? cpu_pal_ir : cpu_std_ir); #endif diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h index 11d59d1..672ab37 100644 --- a/target/hppa/cpu.h +++ b/target/hppa/cpu.h @@ -29,21 +29,21 @@ #include "qemu/interval-tree.h" #include "hw/registerfields.h" -#define MMU_ABS_W_IDX 6 -#define MMU_ABS_IDX 7 -#define MMU_KERNEL_IDX 8 -#define MMU_KERNEL_P_IDX 9 -#define MMU_PL1_IDX 10 -#define MMU_PL1_P_IDX 11 -#define MMU_PL2_IDX 12 -#define MMU_PL2_P_IDX 13 -#define MMU_USER_IDX 14 -#define MMU_USER_P_IDX 15 - -#define MMU_IDX_MMU_DISABLED(MIDX) ((MIDX) < MMU_KERNEL_IDX) -#define MMU_IDX_TO_PRIV(MIDX) (((MIDX) - MMU_KERNEL_IDX) / 2) -#define MMU_IDX_TO_P(MIDX) (((MIDX) - MMU_KERNEL_IDX) & 1) -#define PRIV_P_TO_MMU_IDX(PRIV, P) ((PRIV) * 2 + !!(P) + MMU_KERNEL_IDX) +#define MMU_KERNEL_IDX 0 +#define MMU_KERNEL_P_IDX 1 +#define MMU_PL1_IDX 2 +#define MMU_PL1_P_IDX 3 +#define MMU_PL2_IDX 4 +#define MMU_PL2_P_IDX 5 +#define MMU_USER_IDX 6 +#define MMU_USER_P_IDX 7 +#define MMU_ABS_IDX 8 +#define MMU_ABS_W_IDX 9 + +#define MMU_IDX_MMU_DISABLED(MIDX) ((MIDX) >= MMU_ABS_IDX) +#define MMU_IDX_TO_PRIV(MIDX) ((MIDX) / 2) +#define MMU_IDX_TO_P(MIDX) ((MIDX) & 1) +#define PRIV_P_TO_MMU_IDX(PRIV, P) ((PRIV) * 2 + !!(P)) #define PRIV_KERNEL 0 #define PRIV_USER 3 diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 8842e07..3c8989f 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -25,7 +25,6 @@ #include "pmu.h" #include "time_helper.h" #include "exec/cputlb.h" -#include "exec/tb-flush.h" #include "exec/icount.h" #include "accel/tcg/getpc.h" #include "qemu/guest-random.h" @@ -2173,8 +2172,6 @@ static RISCVException write_misa(CPURISCVState *env, int csrno, env->mstatus &= ~MSTATUS_FS; } - /* flush translation cache */ - tb_flush(env_cpu(env)); env->xl = riscv_cpu_mxl(env); return RISCV_EXCP_NONE; } diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c index 78fb279..143ab07 100644 --- a/target/riscv/tcg/tcg-cpu.c +++ b/target/riscv/tcg/tcg-cpu.c @@ -191,7 +191,8 @@ static TCGTBCPUState riscv_get_tb_cpu_state(CPUState *cs) return (TCGTBCPUState){ .pc = env->xl == MXL_RV32 ? env->pc & UINT32_MAX : env->pc, - .flags = flags + .flags = flags, + .cs_base = env->misa_ext, }; } diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode index 9e39d23..242ec42 100644 --- a/target/sparc/insns.decode +++ b/target/sparc/insns.decode @@ -88,9 +88,10 @@ CALL 01 i:s30 { [ - STBAR 10 00000 101000 01111 0 0000000000000 + STBAR_v9 10 00000 101000 01111 0 0000000000000 MEMBAR 10 00000 101000 01111 1 000000 cmask:3 mmask:4 + RDY_v9 10 rd:5 101000 00000 0 0000000000000 RDCCR 10 rd:5 101000 00010 0 0000000000000 RDASI 10 rd:5 101000 00011 0 0000000000000 RDTICK 10 rd:5 101000 00100 0 0000000000000 @@ -107,8 +108,26 @@ CALL 01 i:s30 RDSTICK_CMPR 10 rd:5 101000 11001 0 0000000000000 RDSTRAND_STATUS 10 rd:5 101000 11010 0 0000000000000 ] - # Before v8, all rs1 accepted; otherwise rs1==0. - RDY 10 rd:5 101000 rs1:5 0 0000000000000 + + # The v8 manual, section B.30 STBAR instruction, says + # bits [12:0] are ignored, but bit 13 must be 0. + # However, section B.28 Read State Register Instruction has a + # comment that RDASR with rs1 = 15, rd = 0 is STBAR. Here, + # bit 13 is also ignored and rd != 0 is merely reserved. + # + # Solaris 8 executes v9 MEMBAR instruction 0x8143e008 during boot. + # This confirms that bit 13 is ignored, as 0x8143c000 is STBAR. + STBAR_v8 10 ----- 101000 01111 - ------------- + + # For v7, bits [18:0] are ignored. + # For v8, bits [18:14], aka rs1, are repurposed and rs1 = 0 is RDY, + # and other values are RDASR. However, the v8 manual explicitly + # says that rs1 in 1..14 yield undefined results and do not cause + # an illegal instruction trap, and rs1 in 16..31 are available for + # implementation specific usage. + # Implement not causing an illegal instruction trap for v8 by + # continuing to interpret unused values per v7, i.e. as RDY. + RDY_v7 10 rd:5 101000 ----- - ------------- } { @@ -139,14 +158,16 @@ CALL 01 i:s30 } { - RDPSR 10 rd:5 101001 00000 0 0000000000000 - RDHPR_hpstate 10 rd:5 101001 00000 0 0000000000000 + [ + RDHPR_hpstate 10 rd:5 101001 00000 0 0000000000000 + RDHPR_htstate 10 rd:5 101001 00001 0 0000000000000 + RDHPR_hintp 10 rd:5 101001 00011 0 0000000000000 + RDHPR_htba 10 rd:5 101001 00101 0 0000000000000 + RDHPR_hver 10 rd:5 101001 00110 0 0000000000000 + RDHPR_hstick_cmpr 10 rd:5 101001 11111 0 0000000000000 + ] + RDPSR 10 rd:5 101001 ----- - ------------- } -RDHPR_htstate 10 rd:5 101001 00001 0 0000000000000 -RDHPR_hintp 10 rd:5 101001 00011 0 0000000000000 -RDHPR_htba 10 rd:5 101001 00101 0 0000000000000 -RDHPR_hver 10 rd:5 101001 00110 0 0000000000000 -RDHPR_hstick_cmpr 10 rd:5 101001 11111 0 0000000000000 { WRPSR 10 00000 110001 ..... . ............. @n_r_ri @@ -159,26 +180,28 @@ RESTORED 10 00001 110001 00000 0 0000000000000 # UA2005 INVALW { - RDWIM 10 rd:5 101010 00000 0 0000000000000 - RDPR_tpc 10 rd:5 101010 00000 0 0000000000000 + [ + RDPR_tpc 10 rd:5 101010 00000 0 0000000000000 + RDPR_tnpc 10 rd:5 101010 00001 0 0000000000000 + RDPR_tstate 10 rd:5 101010 00010 0 0000000000000 + RDPR_tt 10 rd:5 101010 00011 0 0000000000000 + RDPR_tick 10 rd:5 101010 00100 0 0000000000000 + RDPR_tba 10 rd:5 101010 00101 0 0000000000000 + RDPR_pstate 10 rd:5 101010 00110 0 0000000000000 + RDPR_tl 10 rd:5 101010 00111 0 0000000000000 + RDPR_pil 10 rd:5 101010 01000 0 0000000000000 + RDPR_cwp 10 rd:5 101010 01001 0 0000000000000 + RDPR_cansave 10 rd:5 101010 01010 0 0000000000000 + RDPR_canrestore 10 rd:5 101010 01011 0 0000000000000 + RDPR_cleanwin 10 rd:5 101010 01100 0 0000000000000 + RDPR_otherwin 10 rd:5 101010 01101 0 0000000000000 + RDPR_wstate 10 rd:5 101010 01110 0 0000000000000 + RDPR_gl 10 rd:5 101010 10000 0 0000000000000 + RDPR_strand_status 10 rd:5 101010 11010 0 0000000000000 + RDPR_ver 10 rd:5 101010 11111 0 0000000000000 + ] + RDWIM 10 rd:5 101010 ----- - ------------- } -RDPR_tnpc 10 rd:5 101010 00001 0 0000000000000 -RDPR_tstate 10 rd:5 101010 00010 0 0000000000000 -RDPR_tt 10 rd:5 101010 00011 0 0000000000000 -RDPR_tick 10 rd:5 101010 00100 0 0000000000000 -RDPR_tba 10 rd:5 101010 00101 0 0000000000000 -RDPR_pstate 10 rd:5 101010 00110 0 0000000000000 -RDPR_tl 10 rd:5 101010 00111 0 0000000000000 -RDPR_pil 10 rd:5 101010 01000 0 0000000000000 -RDPR_cwp 10 rd:5 101010 01001 0 0000000000000 -RDPR_cansave 10 rd:5 101010 01010 0 0000000000000 -RDPR_canrestore 10 rd:5 101010 01011 0 0000000000000 -RDPR_cleanwin 10 rd:5 101010 01100 0 0000000000000 -RDPR_otherwin 10 rd:5 101010 01101 0 0000000000000 -RDPR_wstate 10 rd:5 101010 01110 0 0000000000000 -RDPR_gl 10 rd:5 101010 10000 0 0000000000000 -RDPR_strand_status 10 rd:5 101010 11010 0 0000000000000 -RDPR_ver 10 rd:5 101010 11111 0 0000000000000 { WRWIM 10 00000 110010 ..... . ............. @n_r_ri @@ -203,7 +226,7 @@ WRPR_strand_status 10 11010 110010 ..... . ............. @n_r_ri { FLUSHW 10 00000 101011 00000 0 0000000000000 - RDTBR 10 rd:5 101011 00000 0 0000000000000 + RDTBR 10 rd:5 101011 ----- - ------------- } { diff --git a/target/sparc/translate.c b/target/sparc/translate.c index b922e53..810e249 100644 --- a/target/sparc/translate.c +++ b/target/sparc/translate.c @@ -2487,7 +2487,7 @@ static int extract_qfpreg(DisasContext *dc, int x) #define TRANS(NAME, AVAIL, FUNC, ...) \ static bool trans_##NAME(DisasContext *dc, arg_##NAME *a) \ - { return avail_##AVAIL(dc) && FUNC(dc, __VA_ARGS__); } + { return avail_##AVAIL(dc) && FUNC(dc, ## __VA_ARGS__); } #define avail_ALL(C) true #ifdef TARGET_SPARC64 @@ -2526,6 +2526,32 @@ static int extract_qfpreg(DisasContext *dc, int x) # define avail_VIS4(C) false #endif +/* + * We decoded bit 13 as imm, and bits [12:0] as rs2_or_imm. + * For v9, if !imm, then the unused bits [12:5] must be zero. + * For v7 and v8, the unused bits are ignored; clear them here. + */ +static bool check_rs2(DisasContext *dc, int *rs2) +{ + if (unlikely(*rs2 & ~0x1f)) { + if (avail_64(dc)) { + return false; + } + *rs2 &= 0x1f; + } + return true; +} + +static bool check_r_r_ri(DisasContext *dc, arg_r_r_ri *a) +{ + return a->imm || check_rs2(dc, &a->rs2_or_imm); +} + +static bool check_r_r_ri_cc(DisasContext *dc, arg_r_r_ri_cc *a) +{ + return a->imm || check_rs2(dc, &a->rs2_or_imm); +} + /* Default case for non jump instructions. */ static bool advance_pc(DisasContext *dc) { @@ -2823,12 +2849,15 @@ static bool trans_Tcc_i_v9(DisasContext *dc, arg_Tcc_i_v9 *a) return do_tcc(dc, a->cond, a->cc, a->rs1, true, a->i); } -static bool trans_STBAR(DisasContext *dc, arg_STBAR *a) +static bool do_stbar(DisasContext *dc) { tcg_gen_mb(TCG_MO_ST_ST | TCG_BAR_SC); return advance_pc(dc); } +TRANS(STBAR_v8, 32, do_stbar) +TRANS(STBAR_v9, 64, do_stbar) + static bool trans_MEMBAR(DisasContext *dc, arg_MEMBAR *a) { if (avail_32(dc)) { @@ -2860,18 +2889,8 @@ static TCGv do_rdy(DisasContext *dc, TCGv dst) return cpu_y; } -static bool trans_RDY(DisasContext *dc, arg_RDY *a) -{ - /* - * TODO: Need a feature bit for sparcv8. In the meantime, treat all - * 32-bit cpus like sparcv7, which ignores the rs1 field. - * This matches after all other ASR, so Leon3 Asr17 is handled first. - */ - if (avail_64(dc) && a->rs1 != 0) { - return false; - } - return do_rd_special(dc, true, a->rd, do_rdy); -} +TRANS(RDY_v7, 32, do_rd_special, true, a->rd, do_rdy) +TRANS(RDY_v9, 64, do_rd_special, true, a->rd, do_rdy) static TCGv do_rd_leon3_config(DisasContext *dc, TCGv dst) { @@ -3256,8 +3275,7 @@ static bool do_wr_special(DisasContext *dc, arg_r_r_ri *a, bool priv, { TCGv src; - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && (a->rs2_or_imm & ~0x1f)) { + if (!check_r_r_ri(dc, a)) { return false; } if (!priv) { @@ -3700,8 +3718,7 @@ static bool do_arith_int(DisasContext *dc, arg_r_r_ri_cc *a, { TCGv dst, src1; - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && a->rs2_or_imm & ~0x1f) { + if (!check_r_r_ri_cc(dc, a)) { return false; } @@ -3785,11 +3802,11 @@ static bool trans_OR(DisasContext *dc, arg_r_r_ri_cc *a) { /* OR with %g0 is the canonical alias for MOV. */ if (!a->cc && a->rs1 == 0) { + if (!check_r_r_ri_cc(dc, a)) { + return false; + } if (a->imm || a->rs2_or_imm == 0) { gen_store_gpr(dc, a->rd, tcg_constant_tl(a->rs2_or_imm)); - } else if (a->rs2_or_imm & ~0x1f) { - /* For simplicity, we under-decoded the rs2 form. */ - return false; } else { gen_store_gpr(dc, a->rd, cpu_regs[a->rs2_or_imm]); } @@ -3806,8 +3823,7 @@ static bool trans_UDIV(DisasContext *dc, arg_r_r_ri *a) if (!avail_DIV(dc)) { return false; } - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && a->rs2_or_imm & ~0x1f) { + if (!check_r_r_ri(dc, a)) { return false; } @@ -3858,8 +3874,7 @@ static bool trans_UDIVX(DisasContext *dc, arg_r_r_ri *a) if (!avail_64(dc)) { return false; } - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && a->rs2_or_imm & ~0x1f) { + if (!check_r_r_ri(dc, a)) { return false; } @@ -3896,8 +3911,7 @@ static bool trans_SDIVX(DisasContext *dc, arg_r_r_ri *a) if (!avail_64(dc)) { return false; } - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && a->rs2_or_imm & ~0x1f) { + if (!check_r_r_ri(dc, a)) { return false; } @@ -4193,8 +4207,7 @@ TRANS(SRA_i, ALL, do_shift_i, a, false, false) static TCGv gen_rs2_or_imm(DisasContext *dc, bool imm, int rs2_or_imm) { - /* For simplicity, we under-decoded the rs2 form. */ - if (!imm && rs2_or_imm & ~0x1f) { + if (!imm && !check_rs2(dc, &rs2_or_imm)) { return NULL; } if (imm || rs2_or_imm == 0) { @@ -4257,8 +4270,7 @@ static bool do_add_special(DisasContext *dc, arg_r_r_ri *a, { TCGv src1, sum; - /* For simplicity, we under-decoded the rs2 form. */ - if (!a->imm && a->rs2_or_imm & ~0x1f) { + if (!check_r_r_ri(dc, a)) { return false; } @@ -4376,8 +4388,7 @@ static TCGv gen_ldst_addr(DisasContext *dc, int rs1, bool imm, int rs2_or_imm) { TCGv addr, tmp = NULL; - /* For simplicity, we under-decoded the rs2 form. */ - if (!imm && rs2_or_imm & ~0x1f) { + if (!imm && !check_rs2(dc, &rs2_or_imm)) { return NULL; } diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc index 3b088b7..caf79c7 100644 --- a/tcg/aarch64/tcg-target.c.inc +++ b/tcg/aarch64/tcg-target.c.inc @@ -1668,7 +1668,7 @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, ldst->oi = oi; ldst->addr_reg = addr_reg; - /* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {tmp0,tmp1}. */ + /* Load CPUTLBDescFast.{mask,table} into {tmp0,tmp1}. */ QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0); QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, table) != 8); tcg_out_insn(s, 3314, LDP, TCG_REG_TMP0, TCG_REG_TMP1, TCG_AREG0, diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc index 338c57b..87ca66b 100644 --- a/tcg/arm/tcg-target.c.inc +++ b/tcg/arm/tcg-target.c.inc @@ -1421,7 +1421,7 @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, ldst->oi = oi; ldst->addr_reg = addr; - /* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {r0,r1}. */ + /* Load CPUTLBDescFast.{mask,table} into {r0,r1}. */ QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0); QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, table) != 4); tcg_out_ldrd_8(s, COND_AL, TCG_REG_R0, TCG_AREG0, fast_off); diff --git a/tcg/optimize.c b/tcg/optimize.c index 3638ab9..f69702b 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1568,9 +1568,10 @@ static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op) return fold_and(ctx, op); } if (fv == -1 && TCG_TARGET_HAS_orc_vec) { + TCGArg ta = op->args[2]; op->opc = INDEX_op_orc_vec; op->args[2] = op->args[1]; - op->args[1] = op->args[3]; + op->args[1] = ta; return fold_orc(ctx, op); } } @@ -425,7 +425,8 @@ static uintptr_t G_GNUC_UNUSED get_jmp_target_addr(TCGContext *s, int which) static int __attribute__((unused)) tlb_mask_table_ofs(TCGContext *s, int which) { - return (offsetof(CPUNegativeOffsetState, tlb.f[which]) - + int fi = mmuidx_to_fast_index(which); + return (offsetof(CPUNegativeOffsetState, tlb.f[fi]) - sizeof(CPUNegativeOffsetState)); } diff --git a/tests/Makefile.include b/tests/Makefile.include index 3538c0c..62a4fc8 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -113,6 +113,9 @@ check-functional: @$(NINJA) precache-functional @QEMU_TEST_NO_DOWNLOAD=1 $(MAKE) SPEED=thorough check-func check-func-quick +.PHONY: check-func check-func-quick +check-func check-func-quick: + # Consolidated targets .PHONY: check check-clean diff --git a/tests/data/vmstate-static-checker/aarch64/virt-7.2.json b/tests/data/vmstate-static-checker/aarch64/virt-7.2.json new file mode 100644 index 0000000..d7491be --- /dev/null +++ b/tests/data/vmstate-static-checker/aarch64/virt-7.2.json @@ -0,0 +1,2571 @@ +{ + "vmschkmachine": { + "Name": "virt-7.2" + }, + "gpex-pcihost": { + "Name": "gpex-pcihost", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "arm_gic": { + "Name": "arm_gic", + "version_id": 12, + "minimum_version_id": 12, + "Description": { + "name": "arm_gic", + "version_id": 12, + "minimum_version_id": 12, + "Fields": [ + { + "field": "ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cpu_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq_state", + "version_id": 1, + "field_exists": false, + "size": 7, + "Description": { + "name": "arm_gic_irq_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "active", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "model", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "edge_trigger", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "group", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "irq_target", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority1", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority2", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sgi_pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority_mask", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "running_priority", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "current_pending", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "bpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "abpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "apr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "nsapr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "arm_gic_virt_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "h_hcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_misr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_lr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_apr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cpu_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "priority_mask", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "running_priority", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "current_pending", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "bpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "abpr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + "arm-gicv3-its-common": { + "Name": "arm-gicv3-its-common", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "arm_gicv3_its", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iidr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cbaser", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "cwriter", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "creadr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "baser", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "arm-gicv3-common": { + "Name": "arm-gicv3-common", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "arm_gicv3", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "gicd_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicd_statusr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "group", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "grpmod", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "active", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "edge_trigger", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicd_ipriority", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "gicd_irouter", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "gicd_nsacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cpu", + "version_id": 0, + "field_exists": false, + "size": 664, + "Description": { + "name": "arm_gicv3_cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_statusr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_waker", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_propbaser", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "gicr_pendbaser", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "gicr_igroupr0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_ienabler0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_ipendr0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_iactiver0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "edge_trigger", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_igrpmodr0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_nsacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gicr_ipriorityr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "icc_ctlr_el1", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "icc_pmr_el1", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "icc_bpr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "icc_apr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "icc_igrpen", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "icc_ctlr_el3", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "arm_gicv3_cpu/virt", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ich_apr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "ich_hcr_el2", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "ich_lr_el2", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "ich_vmcr_el2", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "arm_gicv3_cpu/sre_el1", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "icc_sre_el1", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "arm_gicv3_cpu/gicv4", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "gicr_vpropbaser", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "gicr_vpendbaser", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + } + ], + "Subsections": [ + { + "name": "arm_gicv3/gicd_no_migration_shift_bug", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "gicd_no_migration_shift_bug", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + "fw_cfg": { + "Name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "cfi.pflash01": { + "Name": "cfi.pflash01", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "pflash_cfi01", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "wcycle", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "counter", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "pflash_cfi01_blk_write", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "blk_bytes", + "version_id": 0, + "field_exists": false, + "size": 0 + }, + { + "field": "blk_offset", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "pl061_luminary": { + "Name": "pl061_luminary", + "version_id": 4, + "minimum_version_id": 4, + "Description": { + "name": "pl061", + "version_id": 4, + "minimum_version_id": 4, + "Fields": [ + { + "field": "locked", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "old_out_data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "old_in_data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dir", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "isense", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ibe", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iev", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "im", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "istate", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "afsel", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr2r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr4r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr8r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "odr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "pur", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "pdr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "slr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "den", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "amsel", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ] + } + }, + "pl011_luminary": { + "Name": "pl011_luminary", + "version_id": 2, + "minimum_version_id": 2, + "Description": { + "name": "pl011", + "version_id": 2, + "minimum_version_id": 2, + "Fields": [ + { + "field": "readbuff", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "flags", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "lcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dmacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "int_enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "int_level", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_fifo", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ilpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ibrd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "fbrd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ifl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_pos", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_trigger", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "pl011/clock", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "clk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + } + ] + } + ] + } + }, + "pl061": { + "Name": "pl061", + "version_id": 4, + "minimum_version_id": 4, + "Description": { + "name": "pl061", + "version_id": 4, + "minimum_version_id": 4, + "Fields": [ + { + "field": "locked", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "old_out_data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "old_in_data", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dir", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "isense", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ibe", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iev", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "im", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "istate", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "afsel", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr2r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr4r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dr8r", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "odr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "pur", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "pdr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "slr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "den", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "amsel", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ] + } + }, + "vmcoreinfo": { + "Name": "vmcoreinfo", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "vmcoreinfo", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "has_vmcoreinfo", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "vmcoreinfo.host_format", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "vmcoreinfo.guest_format", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "vmcoreinfo.size", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vmcoreinfo.paddr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "arm_gic_common": { + "Name": "arm_gic_common", + "version_id": 12, + "minimum_version_id": 12, + "Description": { + "name": "arm_gic", + "version_id": 12, + "minimum_version_id": 12, + "Fields": [ + { + "field": "ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cpu_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq_state", + "version_id": 1, + "field_exists": false, + "size": 7, + "Description": { + "name": "arm_gic_irq_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "active", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "model", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "edge_trigger", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "group", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "irq_target", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority1", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority2", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sgi_pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority_mask", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "running_priority", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "current_pending", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "bpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "abpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "apr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "nsapr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "arm_gic_virt_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "h_hcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_misr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_lr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "h_apr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cpu_ctlr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "priority_mask", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "running_priority", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "current_pending", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "bpr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "abpr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + "arm-smmuv3": { + "Name": "arm-smmuv3", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "smmuv3", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "features", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "sid_size", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sid_split", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr0ack", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "statusr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq_ctrl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gerror", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gerrorn", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gerror_irq_cfg0", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "gerror_irq_cfg1", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "gerror_irq_cfg2", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "strtab_base", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "strtab_base_cfg", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "eventq_irq_cfg0", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "eventq_irq_cfg1", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "eventq_irq_cfg2", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cmdq", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "smmuv3_queue", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "base", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "prod", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cons", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "log2size", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "eventq", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "smmuv3_queue", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "base", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "prod", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cons", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "log2size", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + }, + "pl011": { + "Name": "pl011", + "version_id": 2, + "minimum_version_id": 2, + "Description": { + "name": "pl011", + "version_id": 2, + "minimum_version_id": 2, + "Fields": [ + { + "field": "readbuff", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "flags", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "lcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "dmacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "int_enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "int_level", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_fifo", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ilpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ibrd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "fbrd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ifl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_pos", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "read_trigger", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "pl011/clock", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "clk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + } + ] + } + ] + } + }, + "armv7m": { + "Name": "armv7m", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "armv7m", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "refclk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + { + "field": "cpuclk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + } + ] + } + }, + "fw_cfg_mem": { + "Name": "fw_cfg_mem", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "pl031": { + "Name": "pl031", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "pl031", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tick_offset_vmstate", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "mr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "lr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "im", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "is", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "pl031/tick-offset", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tick_offset", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "fw_cfg_io": { + "Name": "fw_cfg_io", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "virtio-serial-device": { + "Name": "virtio-serial-device", + "version_id": 3, + "minimum_version_id": 3, + "Description": { + "name": "virtio-console", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "virtio", + "version_id": 0, + "field_exists": false, + "size": 0 + } + ] + } + }, + "acpi-ged": { + "Name": "acpi-ged", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "acpi-ged", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ged_state", + "version_id": 1, + "field_exists": false, + "size": 560, + "Description": { + "name": "acpi-ged-state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sel", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ], + "Subsections": [ + { + "name": "acpi-ged/memhp", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "memhp_state", + "version_id": 1, + "field_exists": false, + "size": 304, + "Description": { + "name": "memory hotplug state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "selector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "devs", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "memory hotplug device state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "is_enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "is_inserting", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ost_event", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ost_status", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "acpi-ged/ghes", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ghes_state", + "version_id": 1, + "field_exists": false, + "size": 16, + "Description": { + "name": "acpi-ghes", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ghes_addr_le", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + } + ] + } + ] + } + }, + "pcie-host-bridge": { + "Name": "pcie-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "gpio-key": { + "Name": "gpio-key", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "gpio-key", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "timer", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "armv7m_nvic": { + "Name": "armv7m_nvic", + "version_id": 4, + "minimum_version_id": 4, + "Description": { + "name": "armv7m_nvic", + "version_id": 4, + "minimum_version_id": 4, + "Fields": [ + { + "field": "vectors", + "version_id": 1, + "field_exists": false, + "size": 6, + "Description": { + "name": "armv7m_nvic_info", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "prio", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "active", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "prigroup[M_REG_NS]", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "armv7m_nvic/m-security", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sec_vectors", + "version_id": 1, + "field_exists": false, + "size": 6, + "Description": { + "name": "armv7m_nvic_info", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "prio", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "active", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "level", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "prigroup[M_REG_S]", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "itns", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + "pci-host-bridge": { + "Name": "pci-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "gpex-root": { + "Name": "gpex-root", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "gpex_root", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "parent_obj", + "version_id": 0, + "field_exists": false, + "size": 2608, + "Description": { + "name": "PCIDevice", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "version_id", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 256 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 4096 + }, + { + "field": "irq_state", + "version_id": 2, + "field_exists": false, + "size": 16 + } + ] + } + } + ] + } + }, + "armv7m_systick": { + "Name": "armv7m_systick", + "version_id": 3, + "minimum_version_id": 3, + "Description": { + "name": "armv7m_systick", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "refclk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + { + "field": "cpuclk", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "clock", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "clock/muldiv", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "multiplier", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "divider", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + { + "field": "control", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "tick", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "ptimer", + "version_id": 1, + "field_exists": false, + "size": 8, + "Description": { + "name": "ptimer", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "limit", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "delta", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "period_frac", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "period", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "last_event", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "next_event", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "timer", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + } + ] + } + } +} diff --git a/tests/vmstate-static-checker-data/dump1.json b/tests/data/vmstate-static-checker/dump1.json index 334ec07..334ec07 100644 --- a/tests/vmstate-static-checker-data/dump1.json +++ b/tests/data/vmstate-static-checker/dump1.json diff --git a/tests/vmstate-static-checker-data/dump2.json b/tests/data/vmstate-static-checker/dump2.json index 7184e9c..7184e9c 100644 --- a/tests/vmstate-static-checker-data/dump2.json +++ b/tests/data/vmstate-static-checker/dump2.json diff --git a/tests/data/vmstate-static-checker/m68k/virt-7.2.json b/tests/data/vmstate-static-checker/m68k/virt-7.2.json new file mode 100644 index 0000000..16bee8c --- /dev/null +++ b/tests/data/vmstate-static-checker/m68k/virt-7.2.json @@ -0,0 +1,2936 @@ +{ + "vmschkmachine": { + "Name": "virt-7.2" + }, + "m68020-m68k-cpu": { + "Name": "m68020-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "m68030-m68k-cpu": { + "Name": "m68030-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "fw_cfg": { + "Name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "m68k-irq-controller": { + "Name": "m68k-irq-controller", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "m68k-irqc", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ipr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "virt-ctrl": { + "Name": "virt-ctrl", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "virt-ctrl", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "irq_enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "m68040-m68k-cpu": { + "Name": "m68040-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "goldfish_pic": { + "Name": "goldfish_pic", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "goldfish_pic", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "pending", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "goldfish_tty": { + "Name": "goldfish_tty", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "goldfish_tty", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "data_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "data_ptr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "int_enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "rx_fifo", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "Fifo8", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "data", + "version_id": 1, + "field_exists": false, + "size": 0 + }, + { + "field": "head", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "num", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + }, + "m68000-m68k-cpu": { + "Name": "m68000-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "m68010-m68k-cpu": { + "Name": "m68010-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "m68060-m68k-cpu": { + "Name": "m68060-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "fw_cfg_mem": { + "Name": "fw_cfg_mem", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "any-m68k-cpu": { + "Name": "any-m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "fw_cfg_io": { + "Name": "fw_cfg_io", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "virtio-serial-device": { + "Name": "virtio-serial-device", + "version_id": 3, + "minimum_version_id": 3, + "Description": { + "name": "virtio-console", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "virtio", + "version_id": 0, + "field_exists": false, + "size": 0 + } + ] + } + }, + "goldfish_rtc": { + "Name": "goldfish_rtc", + "version_id": 3, + "minimum_version_id": 0, + "Description": { + "name": "goldfish_rtc", + "version_id": 3, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tick_offset_vmstate", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "alarm_next", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "alarm_running", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq_pending", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq_enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "time_high", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "tick_offset", + "version_id": 3, + "field_exists": false, + "size": 8 + } + ] + } + }, + "m68k-cpu": { + "Name": "m68k-cpu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "cpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.dregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.aregs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.current_sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_op", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_x", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_n", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_v", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_c", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cc_z", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_vector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.pending_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "cpu/fpu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.fpcr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fpsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.fregs", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + }, + { + "field": "env.fp_result", + "version_id": 0, + "field_exists": false, + "size": 16, + "Description": { + "name": "freg", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "freg_tmp", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "tmp_mant", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tmp_exp", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "cpu/cf_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.macc", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "env.macsr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mac_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.rambar0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mbar", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_mmu", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.mmu.ar", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.ssw", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.tcr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "env.mmu.urp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.srp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.fault", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "env.mmu.ttr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.mmu.mmusr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "cpu/68040_spregs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "env.vbr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.cacr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.sfc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "env.dfc", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + } +} diff --git a/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json b/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json new file mode 100644 index 0000000..330bbbe --- /dev/null +++ b/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json @@ -0,0 +1,1068 @@ +{ + "vmschkmachine": { + "Name": "pseries-7.2" + }, + "spapr-nvram": { + "Name": "spapr-nvram", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr_nvram", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "size", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "buf", + "version_id": 1, + "field_exists": false, + "size": 0 + } + ] + } + }, + "xive-source": { + "Name": "xive-source", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "xive-source", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "nr_irqs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "status", + "version_id": 1, + "field_exists": false, + "size": 0 + } + ] + } + }, + "xive-tctx": { + "Name": "xive-tctx", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "xive-tctx", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "regs", + "version_id": 0, + "field_exists": false, + "size": 64 + } + ] + } + }, + "pci-host-bridge": { + "Name": "pci-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "ics-spapr": { + "Name": "ics-spapr", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "ics", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "nr_irqs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irqs", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "ics/irq", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "server", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "priority", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "saved_priority", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "flags", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + }, + "scsi-cd": { + "Name": "scsi-cd", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "scsi-disk", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "qdev", + "version_id": 0, + "field_exists": false, + "size": 608, + "Description": { + "name": "SCSIDevice", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "unit_attention.key", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unit_attention.asc", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unit_attention.ascq", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense_is_ua", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "requests", + "version_id": 0, + "field_exists": false, + "size": 0 + } + ], + "Subsections": [ + { + "name": "SCSIDevice/sense", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sense", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + { + "field": "media_changed", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "media_event", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "eject_request", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tray_open", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tray_locked", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "spapr-xive": { + "Name": "spapr-xive", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr-xive", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "nr_irqs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "eat", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "spapr-xive/eas", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "w", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + { + "field": "endt", + "version_id": 0, + "field_exists": false, + "size": 32, + "Description": { + "name": "spapr-xive/end", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "w0", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w1", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w2", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w3", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w4", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w5", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w6", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "w7", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + }, + "scsi-hd": { + "Name": "scsi-hd", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "scsi-disk", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "qdev", + "version_id": 0, + "field_exists": false, + "size": 608, + "Description": { + "name": "SCSIDevice", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "unit_attention.key", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unit_attention.asc", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unit_attention.ascq", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense_is_ua", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "requests", + "version_id": 0, + "field_exists": false, + "size": 0 + } + ], + "Subsections": [ + { + "name": "SCSIDevice/sense", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sense", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + { + "field": "media_changed", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "media_event", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "eject_request", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tray_open", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tray_locked", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "fw_cfg_mem": { + "Name": "fw_cfg_mem", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "spapr-vty": { + "Name": "spapr-vty", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr_vty", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sdev", + "version_id": 0, + "field_exists": false, + "size": 848, + "Description": { + "name": "spapr_vio", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "reg", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "signal_state", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qladdr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qsize", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "crq.qnext", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + { + "field": "in", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "out", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "buf", + "version_id": 0, + "field_exists": false, + "size": 16 + } + ] + } + }, + "spapr-wdt": { + "Name": "spapr-wdt", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr_watchdog", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "timer", + "version_id": 0, + "field_exists": false, + "size": 48 + }, + { + "field": "action", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "leave_others", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "fw_cfg_io": { + "Name": "fw_cfg_io", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "spapr-vscsi": { + "Name": "spapr-vscsi", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr_vscsi", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "vdev", + "version_id": 0, + "field_exists": false, + "size": 848, + "Description": { + "name": "spapr_vio", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "reg", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "signal_state", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qladdr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qsize", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "crq.qnext", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + }, + "spapr-rtc": { + "Name": "spapr-rtc", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr/rtc", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "ns_offset", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "spapr-vlan": { + "Name": "spapr-vlan", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "spapr_llan", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "sdev", + "version_id": 0, + "field_exists": false, + "size": 848, + "Description": { + "name": "spapr_vio", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "reg", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irq", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "signal_state", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qladdr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "crq.qsize", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "crq.qnext", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + { + "field": "isopen", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "buf_list", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "add_buf_ptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "use_buf_ptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rx_bufs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rxq_ptr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "spapr_llan/rx_pools", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "rx_pool", + "version_id": 1, + "field_exists": false, + "size": 8, + "Description": { + "name": "spapr_llan/rx_buffer_pool", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "bufsize", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "bds", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + } + ] + } + ] + } + }, + "fw_cfg": { + "Name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "ics": { + "Name": "ics", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "ics", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "nr_irqs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "irqs", + "version_id": 0, + "field_exists": false, + "size": 8, + "Description": { + "name": "ics/irq", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "server", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "priority", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "saved_priority", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "flags", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + } +} diff --git a/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json b/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json new file mode 100644 index 0000000..9698852 --- /dev/null +++ b/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json @@ -0,0 +1,475 @@ +{ + "vmschkmachine": { + "Name": "s390-ccw-virtio-7.2" + }, + "sclpquiesce": { + "Name": "sclpquiesce", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "sclpquiesce", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "event_pending", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "s390-sclp-event-facility": { + "Name": "s390-sclp-event-facility", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "vmstate-event-facility", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "receive_mask_pieces[1]", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "vmstate-event-facility/mask64", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "receive_mask_pieces[0]", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "vmstate-event-facility/mask_length", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "mask_length", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + ] + } + }, + "zpci": { + "Name": "zpci", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "zpci", + "version_id": 0, + "minimum_version_id": 0 + } + }, + "sclpconsole": { + "Name": "sclpconsole", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "sclpconsole", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "event.event_pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "iov", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "iov_sclp", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iov_bs", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iov_data_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "iov_sclp_rest", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "virtio-serial-device": { + "Name": "virtio-serial-device", + "version_id": 3, + "minimum_version_id": 3, + "Description": { + "name": "virtio-console", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "virtio", + "version_id": 0, + "field_exists": false, + "size": 0 + } + ] + } + }, + "sclplmconsole": { + "Name": "sclplmconsole", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "sclplmconsole", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "event.event_pending", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "write_errors", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "length", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "buf", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "s390-pcihost": { + "Name": "s390-pcihost", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "s390-flic-qemu": { + "Name": "s390-flic-qemu", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "qemu-s390-flic", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "simm", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "nimm", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "fw_cfg_io": { + "Name": "fw_cfg_io", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "s390-ipl": { + "Name": "s390-ipl", + "version_id": 0, + "minimum_version_id": 0, + "Description": { + "name": "ipl", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "compat_start_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "compat_bios_start_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "iplb", + "version_id": 0, + "field_exists": false, + "size": 4096, + "Description": { + "name": "ipl/iplb", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "reserved1", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "devno", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "reserved2", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "ipl/iplb_extended", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "reserved_ext", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + { + "field": "iplb_valid", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cssid", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ssid", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "devno", + "version_id": 0, + "field_exists": false, + "size": 2 + } + ] + } + }, + "pci-host-bridge": { + "Name": "pci-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "fw_cfg_mem": { + "Name": "fw_cfg_mem", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + } +} diff --git a/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json b/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json new file mode 100644 index 0000000..e527dff --- /dev/null +++ b/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json @@ -0,0 +1,3297 @@ +{ + "vmschkmachine": { + "Name": "pc-q35-7.2" + }, + "fw_cfg": { + "Name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "pcie-host-bridge": { + "Name": "pcie-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "isa-pit": { + "Name": "isa-pit", + "version_id": 3, + "minimum_version_id": 2, + "Description": { + "name": "i8254", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "channels[0].irq_disabled", + "version_id": 3, + "field_exists": false, + "size": 4 + }, + { + "field": "channels", + "version_id": 2, + "field_exists": false, + "size": 56, + "Description": { + "name": "pit channel", + "version_id": 2, + "minimum_version_id": 2, + "Fields": [ + { + "field": "count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "latched_count", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "count_latched", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status_latched", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "read_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "write_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "write_latch", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "rw_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "bcd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "gate", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "count_load_time", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "next_transition_time", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + { + "field": "channels[0].next_transition_time", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "mch": { + "Name": "mch", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "mch", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "parent_obj", + "version_id": 0, + "field_exists": false, + "size": 2608, + "Description": { + "name": "PCIDevice", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "version_id", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 256 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 4096 + }, + { + "field": "irq_state", + "version_id": 2, + "field_exists": false, + "size": 16 + } + ] + } + }, + { + "field": "unused", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "pic-common": { + "Name": "pic-common", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "i8259", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "last_irr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "irr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "imr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "isr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority_add", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "irq_base", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "read_reg_select", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "poll", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "special_mask", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "init_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "auto_eoi", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "rotate_on_auto_eoi", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "special_fully_nested_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "init4", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "single_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "elcr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "ICH9-LPC": { + "Name": "ICH9-LPC", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "ICH9LPC", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "d", + "version_id": 0, + "field_exists": false, + "size": 2608, + "Description": { + "name": "PCIDevice", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "version_id", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 256 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 4096 + }, + { + "field": "irq_state", + "version_id": 2, + "field_exists": false, + "size": 16 + } + ] + } + }, + { + "field": "apm", + "version_id": 0, + "field_exists": false, + "size": 304, + "Description": { + "name": "APM State", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "apmc", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "apms", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "pm", + "version_id": 0, + "field_exists": false, + "size": 6480, + "Description": { + "name": "ich9_pm", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "acpi_regs.pm1.evt.sts", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "acpi_regs.pm1.evt.en", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "acpi_regs.pm1.cnt.cnt", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "acpi_regs.tmr.timer", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "acpi_regs.tmr.overflow_time", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "acpi_regs.gpe.sts", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "acpi_regs.gpe.en", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smi_en", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "smi_sts", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "ich9_pm/memhp", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "acpi_memory_hotplug", + "version_id": 1, + "field_exists": false, + "size": 304, + "Description": { + "name": "memory hotplug state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "selector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "devs", + "version_id": 0, + "field_exists": false, + "size": 24, + "Description": { + "name": "memory hotplug device state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "is_enabled", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "is_inserting", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ost_event", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ost_status", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "ich9_pm/tco", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tco_regs", + "version_id": 1, + "field_exists": false, + "size": 320, + "Description": { + "name": "tco io device status", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tco.rld", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "tco.din", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco.dout", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco.sts1", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "tco.sts2", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "tco.cnt1", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "tco.cnt2", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "tco.msg1", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco.msg2", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco.wdcnt", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco.tmr", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "sw_irq_gen", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tco_timer", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "expire_time", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "timeouts_no", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + }, + { + "name": "ich9_pm/cpuhp", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cpuhp_state", + "version_id": 1, + "field_exists": false, + "size": 304, + "Description": { + "name": "CPU hotplug state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "selector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "command", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "devs", + "version_id": 0, + "field_exists": false, + "size": 32, + "Description": { + "name": "CPU hotplug device state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "is_inserting", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "is_removing", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ost_event", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ost_status", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + } + ] + }, + { + "name": "ich9_pm/pcihp", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "acpi_pci_hotplug.hotplug_select", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "acpi_pci_hotplug.acpi_pcihp_pci_status", + "version_id": 1, + "field_exists": false, + "size": 12, + "Description": { + "name": "acpi_pcihp_pci_status", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "up", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "down", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + { + "field": "acpi_pci_hotplug.acpi_index", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + { + "field": "chip_config", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sci_level", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "ICH9LPC/rst_cnt", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "rst_cnt", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "ICH9LPC/smi_feat", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "smi_guest_features_le", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smi_features_ok", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smi_negotiated_features", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "pit-common": { + "Name": "pit-common", + "version_id": 3, + "minimum_version_id": 2, + "Description": { + "name": "i8254", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "channels[0].irq_disabled", + "version_id": 3, + "field_exists": false, + "size": 4 + }, + { + "field": "channels", + "version_id": 2, + "field_exists": false, + "size": 56, + "Description": { + "name": "pit channel", + "version_id": 2, + "minimum_version_id": 2, + "Fields": [ + { + "field": "count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "latched_count", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "count_latched", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status_latched", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "read_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "write_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "write_latch", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "rw_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "bcd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "gate", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "count_load_time", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "next_transition_time", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + { + "field": "channels[0].next_transition_time", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "vmgenid": { + "Name": "vmgenid", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "vmgenid", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "vmgenid_addr_le", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "ioapic-common": { + "Name": "ioapic-common", + "version_id": 3, + "minimum_version_id": 1, + "Description": { + "name": "ioapic", + "version_id": 3, + "minimum_version_id": 1, + "Fields": [ + { + "field": "id", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ioregsel", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unused", + "version_id": 2, + "field_exists": false, + "size": 8 + }, + { + "field": "irr", + "version_id": 2, + "field_exists": false, + "size": 4 + }, + { + "field": "ioredtbl", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "isa-i8259": { + "Name": "isa-i8259", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "i8259", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "last_irr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "irr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "imr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "isr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "priority_add", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "irq_base", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "read_reg_select", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "poll", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "special_mask", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "init_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "auto_eoi", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "rotate_on_auto_eoi", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "special_fully_nested_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "init4", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "single_mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "elcr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "cfi.pflash01": { + "Name": "cfi.pflash01", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "pflash_cfi01", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "wcycle", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "counter", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ], + "Subsections": [ + { + "name": "pflash_cfi01_blk_write", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "blk_bytes", + "version_id": 0, + "field_exists": false, + "size": 0 + }, + { + "field": "blk_offset", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "i8042-mmio": { + "Name": "i8042-mmio", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "pckbd-mmio", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "kbd", + "version_id": 0, + "field_exists": false, + "size": 2328, + "Description": { + "name": "pckbd", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "write_cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending_tmp", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "pckbd_outport", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "outport", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "pckbd/extended_state", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "migration_flags", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "obsrc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "obdata", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cbdata", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + } + ] + } + }, + "isa-serial": { + "Name": "isa-serial", + "version_id": 3, + "minimum_version_id": 2, + "Description": { + "name": "serial", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "state", + "version_id": 0, + "field_exists": false, + "size": 656, + "Description": { + "name": "serial", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "divider", + "version_id": 2, + "field_exists": false, + "size": 2 + }, + { + "field": "rbr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ier", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "iir", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "lcr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mcr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "lsr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "msr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "scr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "fcr_vmstate", + "version_id": 3, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "serial/thr_ipending", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "thr_ipending", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "serial/tsr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tsr_retry", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "thr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tsr", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "serial/recv_fifo", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "recv_fifo", + "version_id": 1, + "field_exists": false, + "size": 24, + "Description": { + "name": "Fifo8", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "data", + "version_id": 1, + "field_exists": false, + "size": 0 + }, + { + "field": "head", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "num", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + }, + { + "name": "serial/xmit_fifo", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "xmit_fifo", + "version_id": 1, + "field_exists": false, + "size": 24, + "Description": { + "name": "Fifo8", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "data", + "version_id": 1, + "field_exists": false, + "size": 0 + }, + { + "field": "head", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "num", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + }, + { + "name": "serial/fifo_timeout_timer", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "fifo_timeout_timer", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "serial/timeout_ipending", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "timeout_ipending", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "serial/poll", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "poll_msl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "modem_status_poll", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + } + ] + } + }, + "ps2-mouse": { + "Name": "ps2-mouse", + "version_id": 2, + "minimum_version_id": 2, + "Description": { + "name": "ps2mouse", + "version_id": 2, + "minimum_version_id": 2, + "Fields": [ + { + "field": "parent_obj", + "version_id": 0, + "field_exists": false, + "size": 1104, + "Description": { + "name": "PS2 Common State", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "write_cmd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.rptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.wptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.data", + "version_id": 0, + "field_exists": false, + "size": 256 + } + ] + } + }, + { + "field": "mouse_status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_resolution", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_sample_rate", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_wrap", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_type", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_detect_state", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mouse_dx", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "mouse_dy", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "mouse_dz", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "mouse_buttons", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "kvmvapic": { + "Name": "kvmvapic", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "kvm-tpr-opt", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "rom_state", + "version_id": 0, + "field_exists": false, + "size": 124, + "Description": { + "name": "kvmvapic-guest-rom", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "unused", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "vaddr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "fixup_start", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "fixup_end", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vapic_vaddr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vapic_size", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vcpu_shift", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "real_tpr_addr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "up", + "version_id": 0, + "field_exists": false, + "size": 44, + "Description": { + "name": "kvmvapic-handlers", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "set_tpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "set_tpr_eax", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "get_tpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "get_tpr_stack", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + { + "field": "mp", + "version_id": 0, + "field_exists": false, + "size": 44, + "Description": { + "name": "kvmvapic-handlers", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "set_tpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "set_tpr_eax", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "get_tpr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "get_tpr_stack", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + }, + { + "field": "state", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "real_tpr_addr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rom_state_vaddr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vapic_paddr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "rom_state_paddr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "ich9-ahci": { + "Name": "ich9-ahci", + "version_id": 1, + "minimum_version_id": 0, + "Description": { + "name": "ich9_ahci", + "version_id": 1, + "minimum_version_id": 0, + "Fields": [ + { + "field": "parent_obj", + "version_id": 0, + "field_exists": false, + "size": 2608, + "Description": { + "name": "PCIDevice", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "version_id", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 256 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 4096 + }, + { + "field": "irq_state", + "version_id": 2, + "field_exists": false, + "size": 16 + } + ] + } + }, + { + "field": "ahci", + "version_id": 0, + "field_exists": false, + "size": 624, + "Description": { + "name": "ahci", + "version_id": 1, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dev", + "version_id": 0, + "field_exists": false, + "size": 6088, + "Description": { + "name": "ahci port", + "version_id": 1, + "minimum_version_id": 0, + "Fields": [ + { + "field": "port", + "version_id": 1, + "field_exists": false, + "size": 2304, + "Description": { + "name": "ide_bus", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unit", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "ide_bus/error", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "error_status", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "retry_sector_num", + "version_id": 2, + "field_exists": false, + "size": 8 + }, + { + "field": "retry_nsector", + "version_id": 2, + "field_exists": false, + "size": 4 + }, + { + "field": "retry_unit", + "version_id": 2, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + { + "field": "port.ifs[0]", + "version_id": 1, + "field_exists": false, + "size": 984, + "Description": { + "name": "ide_drive", + "version_id": 3, + "minimum_version_id": 0, + "Fields": [ + { + "field": "mult_sectors", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "identify_set", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "identify_data", + "version_id": 0, + "field_exists": true, + "size": 512 + }, + { + "field": "feature", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "error", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "nsector", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "sector", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "lcyl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hcyl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hob_feature", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hob_sector", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hob_nsector", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hob_lcyl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "hob_hcyl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "select", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "lba48", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "sense_key", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "asc", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cdrom_changed", + "version_id": 3, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "ide_drive/pio_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "req_nb_sectors", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "io_buffer", + "version_id": 1, + "field_exists": false, + "size": 1 + }, + { + "field": "cur_io_buffer_offset", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "cur_io_buffer_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "end_transfer_fn_idx", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "elementary_transfer_size", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "packet_transfer_size", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "ide_drive/tray_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "tray_open", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "tray_locked", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "ide_drive/atapi/gesn_state", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "events.new_media", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "events.eject_request", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + }, + { + "field": "port_state", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "finished", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.lst_addr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.lst_addr_hi", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.fis_addr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.fis_addr_hi", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.irq_stat", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.irq_mask", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.cmd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.tfdata", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.sig", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.scr_stat", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.scr_ctl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.scr_err", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.scr_act", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "port_regs.cmd_issue", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "done_first_drq", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "busy_slot", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "init_d2h_sent", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ncq_tfs", + "version_id": 1, + "field_exists": false, + "size": 112, + "Description": { + "name": "ncq state", + "version_id": 1, + "minimum_version_id": 0, + "Fields": [ + { + "field": "sector_count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "lba", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "tag", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "slot", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "used", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "halt", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + }, + { + "field": "control_regs.cap", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "control_regs.ghc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "control_regs.irqstatus", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "control_regs.impl", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "control_regs.version", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "idp_index", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "ports", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + } + ] + } + }, + "i8042": { + "Name": "i8042", + "version_id": 3, + "minimum_version_id": 3, + "Description": { + "name": "pckbd", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "kbd", + "version_id": 0, + "field_exists": false, + "size": 2328, + "Description": { + "name": "pckbd", + "version_id": 3, + "minimum_version_id": 3, + "Fields": [ + { + "field": "write_cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pending_tmp", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ], + "Subsections": [ + { + "name": "pckbd_outport", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "outport", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "pckbd/extended_state", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "migration_flags", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "obsrc", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "obdata", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "cbdata", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + ] + } + } + ] + } + }, + "fw_cfg_io": { + "Name": "fw_cfg_io", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + }, + "vmcoreinfo": { + "Name": "vmcoreinfo", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "vmcoreinfo", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "has_vmcoreinfo", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "vmcoreinfo.host_format", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "vmcoreinfo.guest_format", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "vmcoreinfo.size", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "vmcoreinfo.paddr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "ps2-kbd": { + "Name": "ps2-kbd", + "version_id": 3, + "minimum_version_id": 2, + "Description": { + "name": "ps2kbd", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "parent_obj", + "version_id": 0, + "field_exists": false, + "size": 1104, + "Description": { + "name": "PS2 Common State", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "write_cmd", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.rptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.wptr", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.count", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "queue.data", + "version_id": 0, + "field_exists": false, + "size": 256 + } + ] + } + }, + { + "field": "scan_enabled", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "translate", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "scancode_set", + "version_id": 3, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "ps2kbd/ledstate", + "version_id": 3, + "minimum_version_id": 2, + "Fields": [ + { + "field": "ledstate", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + }, + { + "name": "ps2kbd/need_high_bit", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "need_high_bit", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + }, + { + "name": "ps2kbd/command_reply_queue", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "parent_obj.queue.cwptr", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + ] + } + }, + "ICH9-SMB": { + "Name": "ICH9-SMB", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "ich9_smb", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "dev", + "version_id": 0, + "field_exists": false, + "size": 2608, + "Description": { + "name": "PCIDevice", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "version_id", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 256 + }, + { + "field": "config", + "version_id": 0, + "field_exists": true, + "size": 4096 + }, + { + "field": "irq_state", + "version_id": 2, + "field_exists": false, + "size": 16 + } + ] + } + }, + { + "field": "irq_enabled", + "version_id": 0, + "field_exists": true, + "size": 1 + }, + { + "field": "smb", + "version_id": 1, + "field_exists": true, + "size": 384, + "Description": { + "name": "pmsmb", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "smb_stat", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_ctl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_cmd", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_addr", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_data0", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_data1", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_index", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "smb_data", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_auxctl", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "smb_blkdata", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "i2c_enable", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "op_done", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "in_i2c_block_read", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "start_transaction_on_status_read", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + }, + "isa-pcspk": { + "Name": "isa-pcspk", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "pcspk", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "data_on", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "dummy_refresh_clock", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "acpi-erst": { + "Name": "acpi-erst", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "acpi-erst", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "operation", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "busy_status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "command_status", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "record_offset", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "reg_action", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "reg_value", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "record_identifier", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "next_record_index", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "i8257": { + "Name": "i8257", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "dma", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "command", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "mask", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "flip_flop", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "dshift", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "regs", + "version_id": 1, + "field_exists": false, + "size": 40, + "Description": { + "name": "dma_regs", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "now", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "base", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "page", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "pageh", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "dack", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "eop", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + } + ] + } + }, + "port92": { + "Name": "port92", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "port92", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "outport", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "q35-pcihost": { + "Name": "q35-pcihost", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "ioapic": { + "Name": "ioapic", + "version_id": 3, + "minimum_version_id": 1, + "Description": { + "name": "ioapic", + "version_id": 3, + "minimum_version_id": 1, + "Fields": [ + { + "field": "id", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "ioregsel", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "unused", + "version_id": 2, + "field_exists": false, + "size": 8 + }, + { + "field": "irr", + "version_id": 2, + "field_exists": false, + "size": 4 + }, + { + "field": "ioredtbl", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + }, + "smbus-eeprom": { + "Name": "smbus-eeprom", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "smbus-eeprom", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "smbusdev", + "version_id": 0, + "field_exists": false, + "size": 216, + "Description": { + "name": "smbus-device", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "i2c", + "version_id": 0, + "field_exists": false, + "size": 168, + "Description": { + "name": "I2CSlave", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "address", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "mode", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "data_len", + "version_id": 0, + "field_exists": false, + "size": 4 + }, + { + "field": "data_buf", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + { + "field": "data", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "offset", + "version_id": 0, + "field_exists": false, + "size": 1 + }, + { + "field": "accessed", + "version_id": 0, + "field_exists": false, + "size": 1 + } + ] + } + }, + "pci-host-bridge": { + "Name": "pci-host-bridge", + "version_id": 1, + "minimum_version_id": 1, + "Description": { + "name": "PCIHost", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "config_reg", + "version_id": 0, + "field_exists": false, + "size": 4 + } + ] + } + }, + "fw_cfg_mem": { + "Name": "fw_cfg_mem", + "version_id": 2, + "minimum_version_id": 1, + "Description": { + "name": "fw_cfg", + "version_id": 2, + "minimum_version_id": 1, + "Fields": [ + { + "field": "cur_entry", + "version_id": 0, + "field_exists": false, + "size": 2 + }, + { + "field": "cur_offset", + "version_id": 0, + "field_exists": true, + "size": 4 + }, + { + "field": "cur_offset", + "version_id": 2, + "field_exists": false, + "size": 4 + } + ], + "Subsections": [ + { + "name": "fw_cfg/dma", + "version_id": 0, + "minimum_version_id": 0, + "Fields": [ + { + "field": "dma_addr", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + }, + { + "name": "fw_cfg/acpi_mr", + "version_id": 1, + "minimum_version_id": 1, + "Fields": [ + { + "field": "table_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "linker_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + }, + { + "field": "rsdp_mr_size", + "version_id": 0, + "field_exists": false, + "size": 8 + } + ] + } + ] + } + } +} diff --git a/tests/functional/aarch64/meson.build b/tests/functional/aarch64/meson.build index 04846c6..5ad52f9 100644 --- a/tests/functional/aarch64/meson.build +++ b/tests/functional/aarch64/meson.build @@ -19,6 +19,7 @@ test_aarch64_timeouts = { tests_aarch64_system_quick = [ 'migration', + 'vmstate', ] tests_aarch64_system_thorough = [ diff --git a/tests/functional/aarch64/test_virt.py b/tests/functional/aarch64/test_virt.py index 4d0ad90..63071f9 100755 --- a/tests/functional/aarch64/test_virt.py +++ b/tests/functional/aarch64/test_virt.py @@ -72,8 +72,6 @@ class Aarch64VirtMachine(QemuSystemTest): self.set_machine('virt') self.require_accelerator("tcg") - logger = logging.getLogger('aarch64_virt') - kernel_path = self.ASSET_KERNEL.fetch() self.vm.set_console() @@ -91,7 +89,7 @@ class Aarch64VirtMachine(QemuSystemTest): 'rng-random,id=rng0,filename=/dev/urandom') # Also add a scratch block device - logger.info('creating scratch qcow2 image') + self.log.info('creating scratch qcow2 image') image_path = self.scratch_file('scratch.qcow2') qemu_img = get_qemu_img(self) check_call([qemu_img, 'create', '-f', 'qcow2', image_path, '8M'], diff --git a/tests/functional/arm/test_integratorcp.py b/tests/functional/arm/test_integratorcp.py index 4f00924..23ae919 100755 --- a/tests/functional/arm/test_integratorcp.py +++ b/tests/functional/arm/test_integratorcp.py @@ -77,7 +77,6 @@ class IntegratorMachine(QemuSystemTest): command_line='screendump %s' % screendump_path) if 'unknown command' in res: self.skipTest('screendump not available') - logger = logging.getLogger('framebuffer') cpu_count = 1 match_threshold = 0.92 @@ -88,7 +87,7 @@ class IntegratorMachine(QemuSystemTest): loc = np.where(result >= match_threshold) tux_count = 0 for tux_count, pt in enumerate(zip(*loc[::-1]), start=1): - logger.debug('found Tux at position [x, y] = %s', pt) + self.log.debug('found Tux at position [x, y] = %s', pt) self.assertGreaterEqual(tux_count, cpu_count) if __name__ == '__main__': diff --git a/tests/functional/generic/test_vmstate.py b/tests/functional/generic/test_vmstate.py new file mode 100755 index 0000000..387ff54 --- /dev/null +++ b/tests/functional/generic/test_vmstate.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +'''This test runs the vmstate-static-checker script with the current QEMU''' + +import subprocess + +from qemu_test import QemuSystemTest, skipFlakyTest + + +@skipFlakyTest("vmstate-static-checker can produce false positives") +class VmStateTest(QemuSystemTest): + ''' + This test helps to check whether there are problems between old + reference data and the current QEMU + ''' + + def test_vmstate_7_2(self): + '''Check reference data from QEMU v7.2''' + + target_machine = { + 'aarch64': 'virt-7.2', + 'm68k': 'virt-7.2', + 'ppc64': 'pseries-7.2', + 's390x': 's390-ccw-virtio-7.2', + 'x86_64': 'pc-q35-7.2', + } + self.set_machine(target_machine[self.arch]) + + # Run QEMU to get the current vmstate json file: + dst_json = self.scratch_file('dest.json') + self.log.info('Dumping vmstate from %s', self.qemu_bin) + cp = subprocess.run([self.qemu_bin, '-nodefaults', + '-M', target_machine[self.arch], + '-dump-vmstate', dst_json], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, check=True) + if cp.stdout: + self.log.info('QEMU output: %s', cp.stdout) + + # Check whether the old vmstate json file is still compatible: + src_json = self.data_file('..', 'data', 'vmstate-static-checker', + self.arch, + target_machine[self.arch] + '.json') + self.log.info('Comparing vmstate with %s', src_json) + checkerscript = self.data_file('..', '..', 'scripts', + 'vmstate-static-checker.py') + cp = subprocess.run([checkerscript, '-s', src_json, '-d', dst_json], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, check=False) + if cp.returncode != 0: + self.fail('Running vmstate-static-checker failed:\n' + cp.stdout + + '\nThis either means that there is a migration bug ' + 'that needs to be fixed, or\nvmstate-static-checker.py ' + 'needs to be improved (e.g. extend the changed_names\n' + 'in case a field has been renamed), or drop the ' + 'problematic field from\n' + src_json + + '\nin case the script cannot be fixed easily.') + if cp.stdout: + self.log.warning('vmstate-static-checker output: %s', cp.stdout) + + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/hppa/meson.build b/tests/functional/hppa/meson.build index a334837..df2f7cc 100644 --- a/tests/functional/hppa/meson.build +++ b/tests/functional/hppa/meson.build @@ -3,3 +3,7 @@ tests_hppa_system_quick = [ 'seabios', ] + +tests_hppa_system_thorough = [ + 'cdboot', +] diff --git a/tests/functional/hppa/test_cdboot.py b/tests/functional/hppa/test_cdboot.py new file mode 100755 index 0000000..84421e8 --- /dev/null +++ b/tests/functional/hppa/test_cdboot.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# +# CD boot test for HPPA machines +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import QemuSystemTest, Asset, exec_command_and_wait_for_pattern +from qemu_test import wait_for_console_pattern + + +class HppaCdBoot(QemuSystemTest): + + ASSET_CD = Asset( + ('https://github.com/philmd/qemu-testing-blob/raw/ec1b741/' + 'hppa/hp9000/712/C7120023.frm'), + '32c612ad2074516986bdc27768903c561fa92af2ca48e5ac3f3359ade1c42f70') + + def test_cdboot(self): + self.set_machine('B160L') + cdrom_path = self.ASSET_CD.fetch() + + self.vm.set_console() + self.vm.add_args('-cdrom', cdrom_path, + '-boot', 'd', + '-no-reboot') + self.vm.launch() + wait_for_console_pattern(self, 'Unrecognized MODEL TYPE = 502') + wait_for_console_pattern(self, 'UPDATE PAUSED>') + + exec_command_and_wait_for_pattern(self, 'exit\r', 'UPDATE>') + exec_command_and_wait_for_pattern(self, 'ls\r', 'IMAGE1B') + wait_for_console_pattern(self, 'UPDATE>') + exec_command_and_wait_for_pattern(self, 'exit\r', + 'THIS UTILITY WILL NOW RESET THE SYSTEM.....') + + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/m68k/meson.build b/tests/functional/m68k/meson.build index e29044a..679faaf 100644 --- a/tests/functional/m68k/meson.build +++ b/tests/functional/m68k/meson.build @@ -1,5 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-or-later +tests_m68k_system_quick = [ + 'vmstate', +] + tests_m68k_system_thorough = [ 'mcf5208evb', 'nextcube', diff --git a/tests/functional/m68k/test_nextcube.py b/tests/functional/m68k/test_nextcube.py index c1610e5..e5e1c69 100755 --- a/tests/functional/m68k/test_nextcube.py +++ b/tests/functional/m68k/test_nextcube.py @@ -29,8 +29,15 @@ class NextCubeMachine(QemuSystemTest): self.vm.launch() self.log.info('VM launched, waiting for display') - # TODO: wait for the 'displaysurface_create 1120x832' trace-event. - time.sleep(2) + # Wait for the FPU test to finish, then the display is available, too: + while True: + res = self.vm.cmd('human-monitor-command', + command_line='info registers') + if ("F0 = 400e 8400000000000000" in res and + "F1 = 400e 83ff000000000000" in res and + "F2 = 400e 83ff000000000000" in res): + break + time.sleep(0.1) res = self.vm.cmd('human-monitor-command', command_line='screendump %s' % screenshot_path) @@ -56,10 +63,10 @@ class NextCubeMachine(QemuSystemTest): self.check_bootrom_framebuffer(screenshot_path) lines = tesseract_ocr(screenshot_path) text = '\n'.join(lines) + self.assertIn('Backplane slot', text) + self.assertIn('Ethernet address', text) self.assertIn('Testing the FPU', text) - self.assertIn('System test failed. Error code', text) - self.assertIn('Boot command', text) - self.assertIn('Next>', text) + if __name__ == '__main__': QemuSystemTest.main() diff --git a/tests/functional/mips64el/test_malta.py b/tests/functional/mips64el/test_malta.py index 8fdc49b..170147b 100755 --- a/tests/functional/mips64el/test_malta.py +++ b/tests/functional/mips64el/test_malta.py @@ -159,7 +159,6 @@ class MaltaMachineFramebuffer(LinuxKernelTest): command_line='screendump %s' % screendump_path) if 'unknown command' in res: self.skipTest('screendump not available') - logger = logging.getLogger('framebuffer') match_threshold = 0.95 screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR) @@ -171,7 +170,7 @@ class MaltaMachineFramebuffer(LinuxKernelTest): h, w = tuxlogo_bgr.shape[:2] debug_png = os.getenv('QEMU_TEST_CV2_SCREENDUMP_PNG_PATH') for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1): - logger.debug('found Tux at position (x, y) = %s', pt) + self.log.debug('found Tux at position (x, y) = %s', pt) cv2.rectangle(screendump_bgr, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2) if debug_png: diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/meson.build index 842fe0f..1fa0a70 100644 --- a/tests/functional/ppc64/meson.build +++ b/tests/functional/ppc64/meson.build @@ -11,6 +11,7 @@ test_ppc64_timeouts = { tests_ppc64_system_quick = [ 'migration', + 'vmstate', ] tests_ppc64_system_thorough = [ diff --git a/tests/functional/qemu_test/asset.py b/tests/functional/qemu_test/asset.py index 2dd32bf..2971a98 100644 --- a/tests/functional/qemu_test/asset.py +++ b/tests/functional/qemu_test/asset.py @@ -179,9 +179,17 @@ class Asset: self.url, e.reason) raise AssetError(self, "Unable to download: URL error %s" % e.reason, transient=True) + except ConnectionError as e: + # A socket connection failure, such as dropped conn + # or refused conn + tmp_cache_file.unlink() + self.log.error("Unable to download %s: Connection error %s", + self.url, e) + continue except Exception as e: tmp_cache_file.unlink() - raise AssetError(self, "Unable to download: %s" % e) + raise AssetError(self, "Unable to download: %s" % e, + transient=True) if not os.path.exists(tmp_cache_file): raise AssetError(self, "Download retries exceeded", transient=True) diff --git a/tests/functional/replay_kernel.py b/tests/functional/replay_kernel.py index 80795eb..acb1d29 100644 --- a/tests/functional/replay_kernel.py +++ b/tests/functional/replay_kernel.py @@ -32,15 +32,14 @@ class ReplayKernelBase(LinuxKernelTest): # icount requires TCG to be available self.require_accelerator('tcg') - logger = logging.getLogger('replay') start_time = time.time() vm = self.get_vm(name='recording' if record else 'replay') vm.set_console() if record: - logger.info('recording the execution...') + self.log.info('recording the execution...') mode = 'record' else: - logger.info('replaying the execution...') + self.log.info('replaying the execution...') mode = 'replay' vm.add_args('-icount', 'shift=%s,rr=%s,rrfile=%s' % (shift, mode, replay_path), @@ -54,15 +53,15 @@ class ReplayKernelBase(LinuxKernelTest): self.wait_for_console_pattern(console_pattern, vm) if record: vm.shutdown() - logger.info('finished the recording with log size %s bytes' + self.log.info('finished the recording with log size %s bytes' % os.path.getsize(replay_path)) self.run_replay_dump(replay_path) - logger.info('successfully tested replay-dump.py') + self.log.info('successfully tested replay-dump.py') else: vm.wait() - logger.info('successfully finished the replay') + self.log.info('successfully finished the replay') elapsed = time.time() - start_time - logger.info('elapsed time %.2f sec' % elapsed) + self.log.info('elapsed time %.2f sec' % elapsed) return elapsed def run_replay_dump(self, replay_path): @@ -80,5 +79,4 @@ class ReplayKernelBase(LinuxKernelTest): True, shift, args, replay_path) t2 = self.run_vm(kernel_path, kernel_command_line, console_pattern, False, shift, args, replay_path) - logger = logging.getLogger('replay') - logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1)) + self.log.info('replay overhead {:.2%}'.format(t2 / t1 - 1)) diff --git a/tests/functional/s390x/meson.build b/tests/functional/s390x/meson.build index 030b116..70cd36e 100644 --- a/tests/functional/s390x/meson.build +++ b/tests/functional/s390x/meson.build @@ -4,6 +4,10 @@ test_s390x_timeouts = { 'ccw_virtio' : 420, } +tests_s390x_system_quick = [ + 'vmstate', +] + tests_s390x_system_thorough = [ 'ccw_virtio', 'pxelinux', diff --git a/tests/functional/s390x/test_pxelinux.py b/tests/functional/s390x/test_pxelinux.py index 4fc33b8..c00cce6 100755 --- a/tests/functional/s390x/test_pxelinux.py +++ b/tests/functional/s390x/test_pxelinux.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 # # SPDX-License-Identifier: GPL-2.0-or-later -# -# Functional test that checks the pxelinux.cfg network booting of a s390x VM -# (TFTP booting without config file is already tested by the pxe qtest, so -# we don't repeat that here). +''' +Functional test that checks the pxelinux.cfg network booting of a s390x VM +(TFTP booting without config file is already tested by the pxe qtest, so +we don't repeat that here). +''' import os import shutil @@ -12,7 +13,7 @@ import shutil from qemu_test import QemuSystemTest, Asset, wait_for_console_pattern -pxelinux_cfg_contents='''# pxelinux.cfg style config file +PXELINUX_CFG_CONTENTS='''# pxelinux.cfg style config file default Debian label Nonexisting kernel kernel.notavailable @@ -26,6 +27,10 @@ kernel kernel.fedora ''' class S390PxeLinux(QemuSystemTest): + ''' + Test various ways of booting via a pxelinux.cfg file, for details see: + https://wiki.syslinux.org/wiki/index.php?title=PXELINUX#Configuration + ''' ASSET_DEBIAN_KERNEL = Asset( ('https://snapshot.debian.org/archive/debian/' @@ -46,6 +51,7 @@ class S390PxeLinux(QemuSystemTest): '480859574f3f44caa6cd35c62d70e1ac0609134e22ce2a954bbed9b110c06e0b') def pxelinux_launch(self, pl_name='default', extra_opts=None): + '''Create a pxelinux.cfg file in the right location and launch QEMU''' self.require_netdev('user') self.set_machine('s390-ccw-virtio') @@ -66,11 +72,11 @@ class S390PxeLinux(QemuSystemTest): cfg_fname = self.scratch_file('tftp', 'pxelinux.cfg', pl_name) with open(cfg_fname, 'w', encoding='utf-8') as f: - f.write(pxelinux_cfg_contents) + f.write(PXELINUX_CFG_CONTENTS) virtio_net_dev = 'virtio-net-ccw,netdev=n1,bootindex=1' if extra_opts: - virtio_net_dev += ',' + extra_opts + virtio_net_dev += ',' + extra_opts self.vm.add_args('-m', '384', '-netdev', f'user,id=n1,tftp={tftpdir}', @@ -80,6 +86,7 @@ class S390PxeLinux(QemuSystemTest): def test_default(self): + '''Check whether the guest uses the "default" file name''' self.pxelinux_launch() # The kernel prints its arguments to the console, so we can use # this to check whether the kernel parameters are correctly handled: @@ -89,11 +96,13 @@ class S390PxeLinux(QemuSystemTest): wait_for_console_pattern(self, 'Run /init as init process') def test_mac(self): + '''Check whether the guest uses file name based on its MAC address''' self.pxelinux_launch(pl_name='01-02-ca-fe-ba-be-42', extra_opts='mac=02:ca:fe:ba:be:42,loadparm=3') wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x') def test_uuid(self): + '''Check whether the guest uses file name based on its UUID''' # Also add a non-bootable disk to check the fallback to network boot: self.vm.add_args('-blockdev', 'null-co,size=65536,node-name=d1', '-device', 'virtio-blk,drive=d1,bootindex=0,loadparm=1', @@ -102,11 +111,13 @@ class S390PxeLinux(QemuSystemTest): wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)') def test_ip(self): + '''Check whether the guest uses file name based on its IP address''' self.vm.add_args('-M', 'loadparm=3') self.pxelinux_launch(pl_name='0A00020F') wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x') def test_menu(self): + '''Check whether the boot menu works for pxelinux.cfg booting''' self.vm.add_args('-boot', 'menu=on,splash-time=10') self.pxelinux_launch(pl_name='0A00') wait_for_console_pattern(self, '[1] Nonexisting') diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/meson.build index d0b4667..967426c 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -10,13 +10,15 @@ test_x86_64_timeouts = { } tests_x86_64_system_quick = [ + 'bad_vmstate', 'cpu_model_versions', 'cpu_queries', 'mem_addr_space', + 'memlock', 'migration', 'pc_cpu_hotplug_props', 'virtio_version', - 'memlock', + 'vmstate', ] tests_x86_64_system_thorough = [ diff --git a/tests/functional/x86_64/test_acpi_bits.py b/tests/functional/x86_64/test_acpi_bits.py index 8e0563a..9a28165 100755 --- a/tests/functional/x86_64/test_acpi_bits.py +++ b/tests/functional/x86_64/test_acpi_bits.py @@ -121,10 +121,10 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute self._debugcon_log = 'debugcon-log.txt' def _print_log(self, log): - self.logger.info('\nlogs from biosbits follows:') - self.logger.info('==========================================\n') - self.logger.info(log) - self.logger.info('==========================================\n') + self.log.info('\nlogs from biosbits follows:') + self.log.info('==========================================\n') + self.log.info(log) + self.log.info('==========================================\n') def copy_bits_config(self): """ copies the bios bits config file into bits. @@ -138,8 +138,8 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute self.assertTrue(os.path.exists(bits_config_file)) self.assertTrue(os.path.exists(target_config_dir)) shutil.copy2(bits_config_file, target_config_dir) - self.logger.info('copied config file %s to %s', - bits_config_file, target_config_dir) + self.log.info('copied config file %s to %s', + bits_config_file, target_config_dir) def copy_test_scripts(self): """copies the python test scripts into bits. """ @@ -163,8 +163,8 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute newfilename = os.path.splitext(filename)[0] + '.py' shutil.copy2(os.path.join(bits_test_dir, filename), os.path.join(target_test_dir, newfilename)) - self.logger.info('copied test file %s to %s', - filename, target_test_dir) + self.log.info('copied test file %s to %s', + filename, target_test_dir) # now remove the pyc test file if it exists, otherwise the # changes in the python test script won't be executed. @@ -172,9 +172,9 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute if os.access(os.path.join(target_test_dir, testfile_pyc), os.F_OK): os.remove(os.path.join(target_test_dir, testfile_pyc)) - self.logger.info('removed compiled file %s', - os.path.join(target_test_dir, - testfile_pyc)) + self.log.info('removed compiled file %s', + os.path.join(target_test_dir, + testfile_pyc)) def fix_mkrescue(self, mkrescue): """ grub-mkrescue is a bash script with two variables, 'prefix' and @@ -216,7 +216,7 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute self.fix_mkrescue(mkrescue_script) - self.logger.info('using grub-mkrescue for generating biosbits iso ...') + self.log.info('using grub-mkrescue for generating biosbits iso ...') try: if os.getenv('V') or os.getenv('BITS_DEBUG'): @@ -225,7 +225,7 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True) - self.logger.info("grub-mkrescue output %s" % proc.stdout) + self.log.info("grub-mkrescue output %s" % proc.stdout) else: subprocess.check_call([mkrescue_script, '-o', iso_file, bits_dir], @@ -238,11 +238,10 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute self.assertTrue(os.access(iso_file, os.R_OK)) - self.logger.info('iso file %s successfully generated.', iso_file) + self.log.info('iso file %s successfully generated.', iso_file) def setUp(self): # pylint: disable=arguments-differ super().setUp() - self.logger = self.log prebuiltDir = self.scratch_file('prebuilt') if not os.path.isdir(prebuiltDir): @@ -333,7 +332,7 @@ class AcpiBitsTest(QemuSystemTest): #pylint: disable=too-many-instance-attribute # in batch mode and then automatically initiate a vm shutdown. self._vm.event_wait('SHUTDOWN', timeout=BITS_TIMEOUT) self._vm.wait(timeout=None) - self.logger.debug("Checking console output ...") + self.log.debug("Checking console output ...") self.parse_log() if __name__ == '__main__': diff --git a/tests/functional/x86_64/test_bad_vmstate.py b/tests/functional/x86_64/test_bad_vmstate.py new file mode 100755 index 0000000..40098a8 --- /dev/null +++ b/tests/functional/x86_64/test_bad_vmstate.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +'''Test whether the vmstate-static-checker script detects problems correctly''' + +import subprocess + +from qemu_test import QemuBaseTest + + +EXPECTED_OUTPUT='''Warning: checking incompatible machine types: "pc-i440fx-2.1", "pc-i440fx-2.2" +Section "fw_cfg" does not exist in dest +Section "fusbh200-ehci-usb" version error: 2 > 1 +Section "fusbh200-ehci-usb", Description "ehci-core": expected field "usbsts", got "usbsts_pending"; skipping rest +Section "pci-serial-4x" Description "pci-serial-multi": Entry "Fields" missing +Section "intel-hda-generic", Description "intel-hda", Field "pci": missing description +Section "cfi.pflash01": Entry "Description" missing +Section "megasas", Description "PCIDevice": expected field "irq_state", while dest has no further fields +Section "PIIX3-xen" Description "PIIX3": minimum version error: 1 < 2 +Section "PIIX3-xen" Description "PIIX3": Entry "Subsections" missing +Section "tpci200": Description "tpci200" missing, got "tpci2002" instead; skipping +Section "sun-fdtwo" Description "fdc": version error: 2 > 1 +Section "sun-fdtwo", Description "fdrive": Subsection "fdrive/media_rate" not found +Section "usb-kbd" Description "usb-kbd" Field "kbd.keycodes" size mismatch: 4 , 2 +''' + +class BadVmStateTest(QemuBaseTest): + '''Test class for testing vmstat-static-checker script with bad input''' + + def test_checker(self): + """ + Test whether the checker script correctly detects the changes + between dump1.json and dump2.json. + """ + src_json = self.data_file('..', 'data', 'vmstate-static-checker', + 'dump1.json') + dst_json = self.data_file('..', 'data', 'vmstate-static-checker', + 'dump2.json') + checkerscript = self.data_file('..', '..', 'scripts', + 'vmstate-static-checker.py') + + self.log.info('Comparing %s with %s', src_json, dst_json) + cp = subprocess.run([checkerscript, '-s', src_json, '-d', dst_json], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, check=False) + if cp.returncode != 13: + self.fail('Unexpected return code of vmstate-static-checker: ' + + cp.returncode) + if cp.stdout != EXPECTED_OUTPUT: + self.log.info('vmstate-static-checker output:\n%s', cp.stdout) + self.log.info('expected output:\n%s', EXPECTED_OUTPUT) + self.fail('Unexpected vmstate-static-checker output!') + + +if __name__ == '__main__': + QemuBaseTest.main() diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target index 8dc65d7..f5b4d2b 100644 --- a/tests/tcg/multiarch/Makefile.target +++ b/tests/tcg/multiarch/Makefile.target @@ -46,6 +46,8 @@ vma-pthread: LDFLAGS+=-pthread sigreturn-sigmask: CFLAGS+=-pthread sigreturn-sigmask: LDFLAGS+=-pthread +tb-link: LDFLAGS+=-lpthread + # GCC versions 12/13/14/15 at least incorrectly complain about # "'SHA1Transform' reading 64 bytes from a region of size 0"; see the gcc bug # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106709 diff --git a/tests/tcg/multiarch/tb-link.c b/tests/tcg/multiarch/tb-link.c new file mode 100644 index 0000000..4e40306 --- /dev/null +++ b/tests/tcg/multiarch/tb-link.c @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Verify that a single TB spin-loop is properly invalidated, + * releasing the thread from the spin-loop. + */ + +#include <assert.h> +#include <sys/mman.h> +#include <pthread.h> +#include <stdint.h> +#include <stdbool.h> +#include <unistd.h> +#include <sched.h> + + +#ifdef __x86_64__ +#define READY 0x000047c6 /* movb $0,0(%rdi) */ +#define LOOP 0xfceb9090 /* 1: nop*2; jmp 1b */ +#define RETURN 0x909090c3 /* ret; nop*3 */ +#define NOP 0x90909090 /* nop*4 */ +#elif defined(__aarch64__) +#define READY 0x3900001f /* strb wzr,[x0] */ +#define LOOP 0x14000000 /* b . */ +#define RETURN 0xd65f03c0 /* ret */ +#define NOP 0xd503201f /* nop */ +#elif defined(__riscv) +#define READY 0x00050023 /* sb zero, (a0) */ +#define LOOP 0x0000006f /* jal zero, #0 */ +#define RETURN 0x00008067 /* jalr zero, ra, 0 */ +#define NOP 0x00000013 /* nop */ +#endif + + +int main() +{ +#ifdef READY + int tmp; + pthread_t thread_id; + bool hold = true; + uint32_t *buf; + + buf = mmap(NULL, 3 * sizeof(uint32_t), + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(buf != MAP_FAILED); + + buf[0] = READY; + buf[1] = LOOP; + buf[2] = RETURN; + + alarm(2); + + tmp = pthread_create(&thread_id, NULL, (void *(*)(void *))buf, &hold); + assert(tmp == 0); + + while (hold) { + sched_yield(); + } + + buf[1] = NOP; + __builtin___clear_cache(&buf[1], &buf[2]); + + tmp = pthread_join(thread_id, NULL); + assert(tmp == 0); +#endif + return 0; +} |