void vhpt_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry) { region_register_t rr_save, rr; size_t vrn; rid_t rid; uint64_t tag; vhpt_entry_t *ventry; vrn = va >> VRN_SHIFT; rid = ASID2RID(asid, vrn); rr_save.word = rr_read(vrn); rr.word = rr_save.word; rr.map.rid = rid; rr_write(vrn, rr.word); srlz_i(); ventry = (vhpt_entry_t *) thash(va); tag = ttag(va); rr_write(vrn, rr_save.word); srlz_i(); srlz_d(); ventry->word[0] = entry.word[0]; ventry->word[1] = entry.word[1]; ventry->present.tag.tag_word = tag; }
int mdns_send(const struct mdns_ctx *ctx, const struct mdns_hdr *hdr, const struct rr_entry *entries) { uint8_t buf[MDNS_PKT_MAXSZ] = {0}; const struct rr_entry *entry = entries; ssize_t n = 0, l, r; if (!entries) return (MDNS_STDERR); if ((l = mdns_write_hdr(buf, hdr)) < 0) { return (MDNS_STDERR); } n += l; for (entry = entries; entry; entry = entry->next) { l = rr_write(buf+n, entry, (hdr->flags & FLAG_QR) > 0); if (l < 0) { return (MDNS_STDERR); } n += l; } r = sendto(ctx->sock, (const char *) buf, n, 0, (const struct sockaddr *) &ctx->addr, ss_len(&ctx->addr)); return (r < 0 ? MDNS_NETERR : 0); }