static void write_firmware(const char *filename, const struct ia_css_blob_info *blob_original) { FILE *binary; const char name[] = STR(APPL); binary = fopen(filename, "wb"); if (!binary) { fprintf(stderr, "Cannot open firmware file %s\n", filename); exit(1); } if (verbose) { fprintf(stdout, "FW name : %s\n\n", name); } fwrite(&firmware_header, 1, sizeof(firmware_header), binary); if (mem_offsets) fwrite(mem_offsets, 1, mem_offsets_size, binary); if (conf_mem_offsets) fwrite(conf_mem_offsets, 1, conf_mem_offsets_size, binary); if (state_mem_offsets) fwrite(state_mem_offsets, 1, state_mem_offsets_size, binary); fwrite(name, 1, strlen(name) + 1, binary); if (blob != NULL) { struct ia_css_blob_info *blob_aligned = &(firmware_header.blob); size_t size = 0; if (firmware_header.blob.padding_size == 0) { /* MW: This path is redundant */ size += fwrite(blob, 1, firmware_header.blob.size, binary); } else { /* Again assume a fixed order of sections */ /* Fill to an aligned boundary */ size += ffill(blob_aligned->icache_padding, binary); size += fwrite(blob + blob_original->icache_source, 1, blob_original->icache_size, binary); size += ffill(blob_aligned->text_padding, binary); size += fwrite(blob + blob_original->text_source, 1, blob_original->text_size, binary); size += ffill(blob_aligned->data_padding, binary); size += fwrite(blob + blob_original->data_source, 1, blob_original->data_size, binary); } assert(blob_aligned->size == size); } fclose(binary); }
/* * Calculate conditional probability distribution given probability function * and conditioning distributions. * * RUNNING TIME: mul = O(dist->len*SIGMA(dist[i]->len)) * * @param func * probability function * @param dist * array of probability distributions * @param cond * target probability distribution * @return * 0 on success, or error code */ int cbayes_conditional(pfunc *func, pdist **dist, pdist *cond) { // cache pointers, precompute int i, j, b; int clen = func->condlen; int nvars = func->nvars; int nvn1 = nvars - 1; int *idx = func->idx; int *len = func->len; double *val = func->val; double *fdist = func->dist; double **cdist = func->cdist; double *tdist = cond->dist; for (i=0; i<func->nvars; i++) cdist[i] = dist[i]->dist; // initialize to zeros ifill(idx, nvars, 0); ffill(tdist, clen, 0.0); // loop every conditional combination for (i=0; i<clen; i++) { // increment recursive index j = nvn1; while (j >= 0 && (++idx[j] == len[j+1])) idx[j--] = 0; // multiple conditional probabilities together for (; j<nvars; j++) val[j+1] = val[j] * cdist[j][idx[j]]; // multiply by function into target for (j=0, b=i; j<len[0]; j++, b+=cond->len) tdist[j] += cdist[b] * val[nvars]; } // correct within normal tolerance correct(cond->dist, cond->len); return 0; }