mmu new serialization

This commit is contained in:
folkert van heusden 2024-05-14 08:11:53 +02:00
parent 06494afd40
commit 6a192436f4
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 42 additions and 46 deletions

75
mmu.cpp
View file

@ -504,60 +504,60 @@ uint32_t mmu::calculate_physical_address(cpu *const c, const int run_mode, const
return m_offset; return m_offset;
} }
#if IS_POSIX JsonDocument mmu::add_par_pdr(const int run_mode, const bool is_d) const
void mmu::add_par_pdr(json_t *const target, const int run_mode, const bool is_d, const std::string & name) const
{ {
json_t *j = json_object(); JsonDocument j;
json_t *ja_par = json_array(); JsonArray ja_par;
for(int i=0; i<8; i++) for(int i=0; i<8; i++)
json_array_append(ja_par, json_integer(pages[run_mode][is_d][i].par)); ja_par.add(pages[run_mode][is_d][i].par);
json_object_set(j, "par", ja_par); j["par"] = ja_par;
json_t *ja_pdr = json_array(); JsonArray ja_pdr;
for(int i=0; i<8; i++) for(int i=0; i<8; i++)
json_array_append(ja_pdr, json_integer(pages[run_mode][is_d][i].pdr)); ja_pdr.add(pages[run_mode][is_d][i].pdr);
json_object_set(j, "pdr", ja_pdr); j["pdr"] = ja_pdr;
json_object_set(target, name.c_str(), j); return j;
} }
json_t *mmu::serialize() const JsonDocument mmu::serialize() const
{ {
json_t *j = json_object(); JsonDocument j;
for(int run_mode=0; run_mode<4; run_mode++) { for(int run_mode=0; run_mode<4; run_mode++) {
if (run_mode == 2) if (run_mode == 2)
continue; continue;
for(int is_d=0; is_d<2; is_d++) for(int is_d=0; is_d<2; is_d++)
add_par_pdr(j, run_mode, is_d, format("runmode_%d_d_%d", run_mode, is_d)); j[format("runmode_%d_d_%d", run_mode, is_d)] = add_par_pdr(run_mode, is_d);
} }
json_object_set(j, "MMR0", json_integer(MMR0)); j["MMR0"] = MMR0;
json_object_set(j, "MMR1", json_integer(MMR1)); j["MMR1"] = MMR1;
json_object_set(j, "MMR2", json_integer(MMR2)); j["MMR2"] = MMR2;
json_object_set(j, "MMR3", json_integer(MMR3)); j["MMR3"] = MMR3;
json_object_set(j, "CPUERR", json_integer(CPUERR)); j["CPUERR"] = CPUERR;
json_object_set(j, "PIR", json_integer(PIR)); j["PIR"] = PIR;
json_object_set(j, "CSR", json_integer(CSR)); j["CSR"] = CSR;
return j; return j;
} }
void mmu::set_par_pdr(const json_t *const j_in, const int run_mode, const bool is_d, const std::string & name) void mmu::set_par_pdr(const JsonDocument j_in, const int run_mode, const bool is_d)
{ {
json_t *j = json_object_get(j_in, name.c_str()); JsonDocument j_par = j_in["par"];
int i_par = 0;
for(auto & v: j_par)
pages[run_mode][is_d][i++].par = v;
json_t *j_par = json_object_get(j, "par"); JsonDocument j_pdr = j_in["pdr"];
for(int i=0; i<8; i++) int i_pdr = 0;
pages[run_mode][is_d][i].par = json_integer_value(json_array_get(j_par, i)); for(auto & v: j_pdr)
json_t *j_pdr = json_object_get(j, "pdr"); pages[run_mode][is_d][i++].pdr = v;
for(int i=0; i<8; i++)
pages[run_mode][is_d][i].pdr = json_integer_value(json_array_get(j_pdr, i));
} }
mmu *mmu::deserialize(const json_t *const j, memory *const mem) mmu *mmu::deserialize(const JsonDocument j, memory *const mem)
{ {
mmu *m = new mmu(); mmu *m = new mmu();
m->begin(mem); m->begin(mem);
@ -567,17 +567,16 @@ mmu *mmu::deserialize(const json_t *const j, memory *const mem)
continue; continue;
for(int is_d=0; is_d<2; is_d++) for(int is_d=0; is_d<2; is_d++)
m->set_par_pdr(j, run_mode, is_d, format("runmode_%d_d_%d", run_mode, is_d)); m->set_par_pdr(j[format("runmode_%d_d_%d", run_mode, is_d)], run_mode, is_d);
} }
m->MMR0 = json_integer_value(json_object_get(j, "MMR0")); m->MMR0 = j["MMR0"];
m->MMR1 = json_integer_value(json_object_get(j, "MMR1")); m->MMR1 = j["MMR1"];
m->MMR2 = json_integer_value(json_object_get(j, "MMR2")); m->MMR2 = j["MMR2"];
m->MMR3 = json_integer_value(json_object_get(j, "MMR3")); m->MMR3 = j["MMR3"];
m->CPUERR = json_integer_value(json_object_get(j, "CPUERR")); m->CPUERR = j["CPUERR"];
m->PIR = json_integer_value(json_object_get(j, "PIR")); m->PIR = j["PIR"];
m->CSR = json_integer_value(json_object_get(j, "CSR")); m->CSR = j["CSR"];
return m; return m;
} }
#endif

13
mmu.h
View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <ArduinoJson.h>
#include <cstdint> #include <cstdint>
#include <string> #include <string>
@ -57,10 +58,8 @@ private:
memory *m { nullptr }; memory *m { nullptr };
#if IS_POSIX JsonDocument add_par_pdr(const int run_mode, const bool is_d) const;
void add_par_pdr(json_t *const target, const int run_mode, const bool is_d, const std::string & name) const; void set_par_pdr(const JsonDocument j_in, const int run_mode, const bool is_d);
void set_par_pdr(const json_t *const j_in, const int run_mode, const bool is_d, const std::string & name);
#endif
void verify_page_access (cpu *const c, const uint16_t virt_addr, const int run_mode, const bool d, const int apf, const bool is_write); void verify_page_access (cpu *const c, const uint16_t virt_addr, const int run_mode, const bool d, const int apf, const bool is_write);
void verify_access_valid(cpu *const c, const uint32_t m_offset, const int run_mode, const bool d, const int apf, const bool is_io, const bool is_write); void verify_access_valid(cpu *const c, const uint32_t m_offset, const int run_mode, const bool d, const int apf, const bool is_io, const bool is_write);
@ -72,10 +71,8 @@ public:
void begin(memory *const m); void begin(memory *const m);
#if IS_POSIX JsonDocument serialize() const;
json_t *serialize() const; static mmu *deserialize(const JsonDocument j, memory *const m);
static mmu *deserialize(const json_t *const j, memory *const m);
#endif
void mmudebug(const uint16_t a); void mmudebug(const uint16_t a);