master/domain.c
changeset 2614 9b29d7bfa230
parent 2612 668aa5e31137
child 2627 04c83089bac2
equal deleted inserted replaced
2613:7208f4341104 2614:9b29d7bfa230
   345         }
   345         }
   346         if (fmmu->logical_domain_offset >= candidate_start) {
   346         if (fmmu->logical_domain_offset >= candidate_start) {
   347             // As FMMU offsets increase monotonically, and candidate start
   347             // As FMMU offsets increase monotonically, and candidate start
   348             // offset has never been contradicted, it can now never be
   348             // offset has never been contradicted, it can now never be
   349             // contradicted, as no future FMMU can cross it.
   349             // contradicted, as no future FMMU can cross it.
   350             if (candidate_start - datagram_offset > EC_MAX_DATA_SIZE) {
   350             // All FMMUs prior to this point approved for next datagram
       
   351             valid_fmmu = fmmu;
       
   352             valid_start = candidate_start;
       
   353             if (fmmu->logical_domain_offset + fmmu->data_size - datagram_offset
       
   354                     > EC_MAX_DATA_SIZE) {
   351                 // yet the new candidate exceeds the datagram size, so we
   355                 // yet the new candidate exceeds the datagram size, so we
   352                 // use the last known valid candidate to create the datagram
   356                 // use the last known valid candidate to create the datagram
   353                 ret = emplace_datagram(domain, datagram_offset, valid_start,
   357                 ret = emplace_datagram(domain, datagram_offset, valid_start,
   354                     datagram_first_fmmu, valid_fmmu);
   358                     datagram_first_fmmu, valid_fmmu);
   355                 if (ret < 0)
   359                 if (ret < 0)
   357 
   361 
   358                 datagram_offset = valid_start;
   362                 datagram_offset = valid_start;
   359                 datagram_count++;
   363                 datagram_count++;
   360                 datagram_first_fmmu = fmmu;
   364                 datagram_first_fmmu = fmmu;
   361             }
   365             }
   362             // All FMMUs prior to this point approved for next datagram
       
   363             valid_fmmu = fmmu;
       
   364             valid_start = candidate_start;
       
   365         }
   366         }
   366         if (fmmu->logical_domain_offset + fmmu->data_size > candidate_start) {
   367         if (fmmu->logical_domain_offset + fmmu->data_size > candidate_start) {
   367             candidate_start = fmmu->logical_domain_offset + fmmu->data_size;
   368             candidate_start = fmmu->logical_domain_offset + fmmu->data_size;
   368         }
   369         }
   369     }
   370     }
   385 
   386 
   386     list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) {
   387     list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) {
   387         const ec_datagram_t *datagram =
   388         const ec_datagram_t *datagram =
   388             &datagram_pair->datagrams[EC_DEVICE_MAIN];
   389             &datagram_pair->datagrams[EC_DEVICE_MAIN];
   389         EC_MASTER_INFO(domain->master, "  Datagram %s: Logical offset 0x%08x,"
   390         EC_MASTER_INFO(domain->master, "  Datagram %s: Logical offset 0x%08x,"
   390                 " %zu byte, type %s.\n", datagram->name,
   391                 " %zu byte, type %s at %p.\n", datagram->name,
   391                 EC_READ_U32(datagram->address), datagram->data_size,
   392                 EC_READ_U32(datagram->address), datagram->data_size,
   392                 ec_datagram_type_string(datagram));
   393                 ec_datagram_type_string(datagram), datagram);
   393     }
   394     }
   394 
   395 
   395     return 0;
   396     return 0;
   396 }
   397 }
   397 
   398