queued interrupts were not stored

This commit is contained in:
folkert van heusden 2024-04-25 22:18:17 +02:00
parent 0a2f508e61
commit 7c0133dc8d
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
4 changed files with 40 additions and 7 deletions

24
cpu.cpp
View file

@ -2423,6 +2423,18 @@ json_t *cpu::serialize()
if (trap_delay.has_value()) if (trap_delay.has_value())
json_object_set(j, "trap_delay", json_integer(trap_delay.value())); json_object_set(j, "trap_delay", json_integer(trap_delay.value()));
json_t *j_queued_interrupts = json_object();
for(auto & il: queued_interrupts) {
json_t *ja_qi_level = json_array();
for(auto & v: il.second)
json_array_append(ja_qi_level, json_integer(v));
json_object_set(j_queued_interrupts, format("%d", il.first).c_str(), ja_qi_level);
}
json_object_set(j, "queued_interrupts", j_queued_interrupts);
json_object_set(j, "any_queued_interrupts", json_boolean(any_queued_interrupts));
return j; return j;
} }
@ -2454,6 +2466,18 @@ cpu *cpu::deserialize(const json_t *const j, bus *const b, std::atomic_uint32_t
c->trap_delay = json_integer_value(temp); c->trap_delay = json_integer_value(temp);
else else
c->trap_delay.reset(); c->trap_delay.reset();
c->any_queued_interrupts = json_boolean_value(json_object_get(j, "any_queued_interrupts"));
c->init_interrupt_queue();
json_t *j_queued_interrupts = json_object_get(j, "queued_interrupts");
for(int level=0; level<8; level++) {
auto it = c->queued_interrupts.find(level);
json_t *ja_qi_level = json_object_get(j_queued_interrupts, format("%d", level).c_str());
for(size_t i=0; i<json_array_size(ja_qi_level); i++)
it->second.insert(json_integer_value(json_array_get(ja_qi_level, i)));
}
return c; return c;
} }

2
cpu.h
View file

@ -62,6 +62,7 @@ private:
// level, vector // level, vector
std::map<uint8_t, std::set<uint8_t> > queued_interrupts; std::map<uint8_t, std::set<uint8_t> > queued_interrupts;
std::atomic_bool any_queued_interrupts { false };
#if defined(BUILD_FOR_RP2040) #if defined(BUILD_FOR_RP2040)
SemaphoreHandle_t qi_lock { xSemaphoreCreateBinary() }; SemaphoreHandle_t qi_lock { xSemaphoreCreateBinary() };
QueueHandle_t qi_q { xQueueCreate(16, 1) }; QueueHandle_t qi_q { xQueueCreate(16, 1) };
@ -69,7 +70,6 @@ private:
std::mutex qi_lock; std::mutex qi_lock;
std::condition_variable qi_cv; std::condition_variable qi_cv;
#endif #endif
std::atomic_bool any_queued_interrupts { false };
std::map<int, breakpoint *> breakpoints; std::map<int, breakpoint *> breakpoints;
int bp_nr { 0 }; int bp_nr { 0 };

View file

@ -1,6 +1,8 @@
// (C) 2018-2024 by Folkert van Heusden // (C) 2018-2024 by Folkert van Heusden
// Released under MIT license // Released under MIT license
#include <cassert>
#include "disk_backend.h" #include "disk_backend.h"
#include "disk_backend_file.h" #include "disk_backend_file.h"
#include "disk_backend_nbd.h" #include "disk_backend_nbd.h"
@ -17,17 +19,21 @@ disk_backend::~disk_backend()
#if IS_POSIX #if IS_POSIX
disk_backend *disk_backend::deserialize(const json_t *const j) disk_backend *disk_backend::deserialize(const json_t *const j)
{ {
std::string type = json_string_value(json_object_get(j, "disk-backend-type")); std::string type = json_string_value(json_object_get(j, "disk-backend-type"));
disk_backend *d = nullptr;
if (type == "file") if (type == "file")
return disk_backend_file::deserialize(j); d = disk_backend_file::deserialize(j);
if (type == "nbd") else if (type == "nbd")
return disk_backend_nbd::deserialize(j); d = disk_backend_nbd::deserialize(j);
// should not be reached // should not be reached
assert(false); assert(d);
return nullptr; d->begin();
return d;
} }
#endif #endif

View file

@ -570,6 +570,9 @@ int main(int argc, char *argv[])
b = bus::deserialize(j, cnsl, &event); b = bus::deserialize(j, cnsl, &event);
json_decref(j); json_decref(j);
DOLOG(warning, true, "DO NOT FORGET TO DELETE AND NOT TO RE-USE THE STATE FILE (\"%s\")! (unless updated)", deserialize.c_str());
myusleep(251000);
} }
if (b->getTty() == nullptr) { if (b->getTty() == nullptr) {