static int write_nuls(zip_uint64_t n, FILE *f) { if (fwrite(MARK_NUL, 4, 1, f) != 1) { return -1; } return write_u64(n, f); }
static void write_gcda(char *addr, struct gcov_info* gi) { const char* filename = SKIBOOT_ADDR(addr, gi->filename); int fd; u32 fn; struct gcov_fn_info *fn_info; struct gcov_fn_info **functions; struct gcov_ctr_info *ctr_info; u32 ctr; u32 cv; printf("Writing %s\n", filename); fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); write_u32(fd, GCOV_DATA_MAGIC); write_u32(fd, be32toh(gi->version)); write_u32(fd, be32toh(gi->stamp)); //printf("nfunctions: %d \n", be32toh(gi->n_functions)); for(fn = 0; fn < be32toh(gi->n_functions); fn++) { functions = (struct gcov_fn_info**) SKIBOOT_ADDR(addr, gi->functions); fn_info = (struct gcov_fn_info*) SKIBOOT_ADDR(addr, functions[fn]); write_u32(fd, GCOV_TAG_FUNCTION); write_u32(fd, GCOV_TAG_FUNCTION_LENGTH); write_u32(fd, be32toh(fn_info->ident)); write_u32(fd, be32toh(fn_info->lineno_checksum)); write_u32(fd, be32toh(fn_info->cfg_checksum)); ctr_info = (struct gcov_ctr_info*) ((char*)fn_info + sizeof(struct gcov_fn_info)); for(ctr = 0; ctr < GCOV_COUNTERS; ctr++) { if (!counter_active(gi, ctr)) continue; write_u32(fd, (GCOV_TAG_FOR_COUNTER(ctr))); write_u32(fd, be32toh(ctr_info->num)*2); /* printf(" ctr %d gcov_ctr_info->num %u\n", * ctr, be32toh(ctr_info->num)); */ for(cv = 0; cv < be32toh(ctr_info->num); cv++) { gcov_type *ctrv = (gcov_type *) SKIBOOT_ADDR(addr, ctr_info->values); //printf("%lx\n", be64toh(ctrv[cv])); write_u64(fd, be64toh(ctrv[cv])); } ctr_info++; } } close(fd); }
static int buffer_to_file(buffer_t *buffer, const char *fname, zip_error_t *error) { FILE *f = fopen(fname, "wb"); zip_uint64_t i; zip_uint64_t nul_run; if (f == NULL) { zip_error_set(error, ZIP_ER_OPEN, errno); return -1; } fwrite(MARK_BEGIN, 4, 1, f); write_u64(buffer->fragment_size, f); write_u64(buffer->size, f); nul_run = 0; for (i=0; i * buffer->fragment_size <buffer->size; i++) { if (buffer->fragment[i] == NULL || only_nul(buffer->fragment[i], buffer->fragment_size)) { nul_run++; } else { if (nul_run > 0) { write_nuls(nul_run, f); nul_run = 0; } fwrite(MARK_DATA, 4, 1, f); fwrite(buffer->fragment[i], 1, buffer->fragment_size, f); } } if (nul_run > 0) { write_nuls(nul_run, f); } if (fclose(f) != 0) { zip_error_set(error, ZIP_ER_WRITE, errno); return -1; } return 0; }
u32 xbinary_writer::write(u64 b) { if (_can_write(len_, cursor_, sizeof(b))) { write_u64((xbyte*)buffer_ + cursor_, b); cursor_ += sizeof(b); return sizeof(b); } return 0; }
static void write_u64_func(void** state) { char buf[27]; char comp_buf[27]; uint64_t value = 0; uint32_t idx = 0; for(uint64_t i = 0; i < CHAR_SIZE - 2; i += 8) { value = (('a' + i) << 56) | (('b' + i) << 48) | (('c' + i) << 40) | (('d' + i) << 32) | (('e' + i) << 24) | (('f' + i) << 16) | (('g' + i) << 8) | ('h' + i); sprintf(comp_buf + i, "%c%c%c%c%c%c%c%c%c", 'a' + (int)i, 'b' + (int)i, 'c' + (int)i, 'd' + (int)i, 'e' + (int)i, 'f' + (int)i, 'g' + (int)i, 'h' + (int)i, '\0'); write_u64(buf, value, &idx); buf[idx] = '\0'; assert_string_equal(buf, comp_buf); } }
void process(NIC* ni) { static uint32_t myip = 0xc0a86402; // 192.168.100.2 Packet* packet = nic_input(ni); if(!packet) return; Ether* ether = (Ether*)(packet->buffer + packet->start); if(endian16(ether->type) == ETHER_TYPE_ARP) { // ARP response ARP* arp = (ARP*)ether->payload; if(endian16(arp->operation) == 1 && endian32(arp->tpa) == myip) { ether->dmac = ether->smac; ether->smac = endian48(ni->mac); arp->operation = endian16(2); arp->tha = arp->sha; arp->tpa = arp->spa; arp->sha = ether->smac; arp->spa = endian32(myip); nic_output(ni, packet); packet = NULL; } } else if(endian16(ether->type) == ETHER_TYPE_IPv4) { IP* ip = (IP*)ether->payload; if(ip->protocol == IP_PROTOCOL_ICMP && endian32(ip->destination) == myip) { // Echo reply ICMP* icmp = (ICMP*)ip->body; icmp->type = 0; icmp->checksum = 0; icmp->checksum = endian16(checksum(icmp, packet->end - packet->start - ETHER_LEN - IP_LEN)); ip->destination = ip->source; ip->source = endian32(myip); ip->ttl = endian8(64); ip->checksum = 0; ip->checksum = endian16(checksum(ip, ip->ihl * 4)); ether->dmac = ether->smac; ether->smac = endian48(ni->mac); nic_output(ni, packet); packet = NULL; } else if(ip->protocol == IP_PROTOCOL_UDP) { UDP* udp = (UDP*)ip->body; if(endian16(udp->destination) == 9000) { reply_count = 2; // Control packet uint32_t idx = 0; seq = read_u16(udp->body, &idx); user_mac = endian48(ether->smac); user_ip = endian32(ip->source); user_port = endian16(udp->source); uint8_t msg = read_u8(udp->body, &idx); switch(msg) { case 1: // MSG_CREATE { idx++; // read ctype uint32_t clen = read_u32(udp->body, &idx); char collection[clen + 1]; collection[clen] = '\0'; memcpy(collection, udp->body + idx, clen); idx += clen; uint64_t id = newID(collection); memmove(udp->body + idx + 9, udp->body + idx, endian16(udp->length) - 8 - idx); packet->end += 9; udp->length = endian16(endian16(udp->length) + 9); ip->length = endian16(endian16(ip->length) + 9); write_u8(udp->body, 4, &idx); write_u64(udp->body, id, &idx); } break; case 2: // MSG_READ reply_count = 1; break; case 3: // MSG_RETRIEVE break; case 4: // MSG_UPDATE break; case 5: // MSG_DELETE break; case 6: // MSG_HELLO reply_count = 1; break; } udp->source = endian16(9999); udp->destination = endian16(9001); udp->checksum = 0; ip->destination = ip->source; ip->source = endian32(myip); ip->ttl = endian8(ip->ttl) - 1; ip->checksum = 0; ip->checksum = endian16(checksum(ip, ip->ihl * 4)); ether->dmac = ether->smac; ether->smac = endian48(ni->mac); nic_output_dup(ni, packet); udp->destination = endian16(9002); ip->checksum = 0; ip->checksum = endian16(checksum(ip, ip->ihl * 4)); nic_output_dup(ni, packet); udp->destination = endian16(9003); ip->checksum = 0; ip->checksum = endian16(checksum(ip, ip->ihl * 4)); nic_output(ni, packet); packet = NULL; } else if(endian16(udp->destination) == 9999) { uint32_t idx = 0; uint16_t seq2 = read_u16(udp->body, &idx); if(seq == seq2 && --reply_count == 0) { udp->checksum = 0; udp->destination = endian16(user_port); udp->source = endian16(9000); ip->destination = endian32(user_ip); ip->source = endian32(myip); ip->ttl = endian8(64); ip->checksum = 0; ip->checksum = endian16(checksum(ip, ip->ihl * 4)); ether->dmac = endian48(user_mac); ether->smac = endian48(ni->mac); nic_output(ni, packet); packet = NULL; } } } } if(packet) nic_free(packet); }