save/load состояние устройства в qemu
Имеется pci устройство, которое обрабатывает некоторые команды. Запись в него и чтение из него происходит через callback'и MemoryRegion'a. Формат команд абсолютно разный. При поступлении команды мы находим нужный обработчик, входим в него, далее необходимо выйти из него, чтобы получить данные, потом опять войти в обработчик, возможно получить ещё данные, то есть постоянный вход/выход. Чтобы это всё работало сейчас все обработчики разбиты по кускам и сделана стейт машина, которая переключается между ними. В данном случае легко сделать сохранение/восстановление устройства, так как всё хранится в структурах.
Но есть огромные минусы. Дабавляются новые более сложные команды, растёт стейт-машина, отлаживать становится всё сложнее и сложнее. К тому же, когда обработчики разбиты по кускам - код очень сложно читабельный и вероятность наделать ошибок сильно возрастает.
Есть мысли запускать обработчики в отдельном потоке или использовать coroutine. Тогда обработчики будут в виде отдельных функций, когда надо что-то записать/почитать просто делаем yield(), а после продолжаем исполнение с этой же самой точки. Всё хорошо, но не понятно как сохранять состояние. Coroutine работает за счёт переключения стэка и нельзя его просто сохранить, так как при след запуске будут совершенно другие адреса.
Есть 2 дурацкие идеи, мб у кого будут умные?-)
зы. надеюсь не слишком запутанно написал