| 792 | } |
| 793 | |
| 794 | void |
| 795 | ktrstructarray(const char *name, enum uio_seg seg, const void *data, |
| 796 | int num_items, size_t struct_size) |
| 797 | { |
| 798 | struct ktr_request *req; |
| 799 | struct ktr_struct_array *ksa; |
| 800 | char *buf; |
| 801 | size_t buflen, datalen, namelen; |
| 802 | int max_items; |
| 803 | |
| 804 | if (__predict_false(curthread->td_pflags & TDP_INKTRACE)) |
| 805 | return; |
| 806 | |
| 807 | /* Trim array length to genio size. */ |
| 808 | max_items = ktr_geniosize / struct_size; |
| 809 | if (num_items > max_items) { |
| 810 | if (max_items == 0) |
| 811 | num_items = 1; |
| 812 | else |
| 813 | num_items = max_items; |
| 814 | } |
| 815 | datalen = num_items * struct_size; |
| 816 | |
| 817 | if (data == NULL) |
| 818 | datalen = 0; |
| 819 | |
| 820 | namelen = strlen(name) + 1; |
| 821 | buflen = namelen + datalen; |
| 822 | buf = malloc(buflen, M_KTRACE, M_WAITOK); |
| 823 | strcpy(buf, name); |
| 824 | if (seg == UIO_SYSSPACE) |
| 825 | bcopy(data, buf + namelen, datalen); |
| 826 | else { |
| 827 | if (copyin(data, buf + namelen, datalen) != 0) { |
| 828 | free(buf, M_KTRACE); |
| 829 | return; |
| 830 | } |
| 831 | } |
| 832 | if ((req = ktr_getrequest(KTR_STRUCT_ARRAY)) == NULL) { |
| 833 | free(buf, M_KTRACE); |
| 834 | return; |
| 835 | } |
| 836 | ksa = &req->ktr_data.ktr_struct_array; |
| 837 | ksa->struct_size = struct_size; |
| 838 | req->ktr_buffer = buf; |
| 839 | req->ktr_header.ktr_len = buflen; |
| 840 | ktr_submitrequest(curthread, req); |
| 841 | } |
| 842 | |
| 843 | void |
| 844 | ktrcapfail(enum ktr_cap_fail_type type, const cap_rights_t *needed, |
no test coverage detected