@@ -108,39 +108,6 @@ const pma_entry::flags machine::m_cmio_tx_buffer_flags{
108
108
PMA_ISTART_DID::cmio_tx_buffer // DID
109
109
};
110
110
111
- pma_entry machine::make_memory_range_pma_entry (const std::string &description, const memory_range_config &c) {
112
- if (c.image_filename .empty ()) {
113
- return make_callocd_memory_pma_entry (description, c.start , c.length );
114
- }
115
- return make_mmapd_memory_pma_entry (description, c.start , c.length , c.image_filename , c.shared );
116
- }
117
-
118
- pma_entry machine::make_flash_drive_pma_entry (const std::string &description, const memory_range_config &c) {
119
- return make_memory_range_pma_entry (description, c).set_flags (m_flash_drive_flags);
120
- }
121
-
122
- pma_entry machine::make_cmio_rx_buffer_pma_entry (const cmio_config &c) {
123
- const auto description = " cmio rx buffer memory range" s;
124
- if (!c.rx_buffer .image_filename .empty ()) {
125
- return make_mmapd_memory_pma_entry (description, PMA_CMIO_RX_BUFFER_START, PMA_CMIO_RX_BUFFER_LENGTH,
126
- c.rx_buffer .image_filename , c.rx_buffer .shared )
127
- .set_flags (m_cmio_rx_buffer_flags);
128
- }
129
- return make_callocd_memory_pma_entry (description, PMA_CMIO_RX_BUFFER_START, PMA_CMIO_RX_BUFFER_LENGTH)
130
- .set_flags (m_cmio_rx_buffer_flags);
131
- }
132
-
133
- pma_entry machine::make_cmio_tx_buffer_pma_entry (const cmio_config &c) {
134
- const auto description = " cmio tx buffer memory range" s;
135
- if (!c.tx_buffer .image_filename .empty ()) {
136
- return make_mmapd_memory_pma_entry (description, PMA_CMIO_TX_BUFFER_START, PMA_CMIO_TX_BUFFER_LENGTH,
137
- c.tx_buffer .image_filename , c.tx_buffer .shared )
138
- .set_flags (m_cmio_tx_buffer_flags);
139
- }
140
- return make_callocd_memory_pma_entry (description, PMA_CMIO_TX_BUFFER_START, PMA_CMIO_TX_BUFFER_LENGTH)
141
- .set_flags (m_cmio_tx_buffer_flags);
142
- }
143
-
144
111
pma_entry &machine::register_pma_entry (pma_entry &&pma) {
145
112
if (m_s.pmas .capacity () <= m_s.pmas .size ()) { // NOLINT(readability-static-accessed-through-instance)
146
113
throw std::runtime_error{" too many PMAs when adding " s + pma.get_description ()};
@@ -199,7 +166,9 @@ void machine::replace_memory_range(const memory_range_config &range) {
199
166
throw std::invalid_argument{" attempt to replace a protected range " s + pma.get_description ()};
200
167
}
201
168
// replace range preserving original flags
202
- pma = make_memory_range_pma_entry (pma.get_description (), range).set_flags (pma.get_flags ());
169
+ pma = make_mmapd_memory_pma_entry (pma.get_description (), range.start , range.length , range.image_filename ,
170
+ range.shared )
171
+ .set_flags (pma.get_flags ());
203
172
return ;
204
173
}
205
174
}
@@ -322,19 +291,22 @@ machine::machine(const machine_config &c, const machine_runtime_config &r) :
322
291
write_reg (reg::iflags, m_c.processor .iflags );
323
292
write_reg (reg::iunrep, m_c.processor .iunrep );
324
293
325
- // Register RAM
326
- if (m_c.ram .image_filename .empty ()) {
327
- register_pma_entry (make_callocd_memory_pma_entry (" RAM" s, PMA_RAM_START, m_c.ram .length ).set_flags (m_ram_flags));
328
- } else {
329
- register_pma_entry (make_callocd_memory_pma_entry (" RAM" s, PMA_RAM_START, m_c.ram .length , m_c.ram .image_filename )
330
- .set_flags (m_ram_flags));
294
+ // TODO(edubart): handle case when backing storage is the same dir
295
+ // TODO(edubart): remove directory + files on failure
296
+ if (!m_r.backing_storage .empty ()) {
297
+ os_mkdir (m_r.backing_storage .c_str (), 0700 );
331
298
}
332
299
300
+ // Register uarch PMAs
301
+ m_uarch.register_pmas (m_r);
302
+
303
+ // Register RAM
304
+ register_pma_entry (make_memory_range_pma_entry (" RAM" s, m_ram_flags, PMA_RAM_START, m_c.ram .length ,
305
+ m_c.ram .image_filename , false , m_r));
306
+
333
307
// Register DTB
334
- pma_entry &dtb = register_pma_entry ((m_c.dtb .image_filename .empty () ?
335
- make_callocd_memory_pma_entry (" DTB" s, PMA_DTB_START, PMA_DTB_LENGTH) :
336
- make_callocd_memory_pma_entry (" DTB" s, PMA_DTB_START, PMA_DTB_LENGTH, m_c.dtb .image_filename ))
337
- .set_flags (m_dtb_flags));
308
+ pma_entry &dtb = register_pma_entry (make_memory_range_pma_entry (" DTB" s, m_dtb_flags, PMA_DTB_START, PMA_DTB_LENGTH,
309
+ m_c.dtb .image_filename , false , m_r));
338
310
339
311
// Register all flash drives
340
312
int i = 0 ;
@@ -360,13 +332,18 @@ machine::machine(const machine_config &c, const machine_runtime_config &r) :
360
332
}
361
333
f.length = length;
362
334
}
363
- register_pma_entry (make_flash_drive_pma_entry (flash_description, f));
335
+ register_pma_entry (make_memory_range_pma_entry (flash_description, m_flash_drive_flags, f.start , f.length ,
336
+ f.image_filename , f.shared , m_r));
364
337
i++;
365
338
}
366
339
367
340
// Register cmio memory ranges
368
- register_pma_entry (make_cmio_tx_buffer_pma_entry (m_c.cmio ));
369
- register_pma_entry (make_cmio_rx_buffer_pma_entry (m_c.cmio ));
341
+ register_pma_entry (
342
+ make_memory_range_pma_entry (" cmio tx buffer memory range" s, m_cmio_tx_buffer_flags, PMA_CMIO_TX_BUFFER_START,
343
+ PMA_CMIO_TX_BUFFER_LENGTH, m_c.cmio .tx_buffer .image_filename , m_c.cmio .tx_buffer .shared , m_r));
344
+ register_pma_entry (
345
+ make_memory_range_pma_entry (" cmio rx buffer memory range" s, m_cmio_rx_buffer_flags, PMA_CMIO_RX_BUFFER_START,
346
+ PMA_CMIO_RX_BUFFER_LENGTH, m_c.cmio .rx_buffer .image_filename , m_c.cmio .rx_buffer .shared , m_r));
370
347
371
348
// Register HTIF device
372
349
register_pma_entry (make_htif_pma_entry (PMA_HTIF_START, PMA_HTIF_LENGTH, &m_r.htif ));
@@ -485,7 +462,7 @@ machine::machine(const machine_config &c, const machine_runtime_config &r) :
485
462
if (!m_c.tlb .image_filename .empty ()) {
486
463
// Create a temporary PMA entry just to load TLB contents from an image file
487
464
pma_entry tlb_image_pma = make_mmapd_memory_pma_entry (" shadow TLB device" s, PMA_SHADOW_TLB_START,
488
- PMA_SHADOW_TLB_LENGTH, m_c.tlb .image_filename , false );
465
+ PMA_SHADOW_TLB_LENGTH, m_c.tlb .image_filename );
489
466
unsigned char *hmem = tlb_image_pma.get_memory ().get_host_memory ();
490
467
for (uint64_t i = 0 ; i < PMA_TLB_SIZE; ++i) {
491
468
load_tlb_entry<TLB_CODE>(*this , i, hmem);
@@ -771,9 +748,8 @@ static void store_hash(const machine::hash_type &h, const std::string &dir) {
771
748
}
772
749
773
750
void machine::store (const std::string &dir) const {
774
- if (os_mkdir (dir.c_str (), 0700 )) {
775
- throw std::system_error{errno, std::generic_category (), " error creating directory '" s + dir + " '" s};
776
- }
751
+ // TODO(edubart): handle the case of saving to backing storage
752
+ os_mkdir (dir.c_str (), 0700 );
777
753
if (!m_r.skip_root_hash_store ) {
778
754
if (!update_merkle_tree ()) {
779
755
throw std::runtime_error{" error updating Merkle tree" };
@@ -789,6 +765,19 @@ void machine::store(const std::string &dir) const {
789
765
790
766
// NOLINTNEXTLINE(modernize-use-equals-default)
791
767
machine::~machine () {
768
+ if (!m_r.backing_storage .empty ()) {
769
+ try {
770
+ // TODO(edubart): save root hash?
771
+ // TODO(edubart): make tlb a memory PMA?
772
+ store_device_pma (*this , find_pma_entry<uint64_t >(PMA_SHADOW_TLB_START), m_r.backing_storage );
773
+ auto c = get_serialization_config ();
774
+ c.store (m_r.backing_storage );
775
+ } catch (std::exception &e) {
776
+ // Silently fail
777
+ (void ) fprintf (stderr, " unable to save backing storage machine config: %s\n " , e.what ());
778
+ }
779
+ }
780
+
792
781
// Cleanup TTY if console input was enabled
793
782
if (m_c.htif .console_getchar || has_virtio_console ()) {
794
783
os_close_tty ();
0 commit comments